这边以之前的 use case 当作例子来撰写测试。
首先要能快速地建立测资,需要透过 Factory Bot 制定规则。
# order_factory.rb
FactoryBot.define do
factory :entity_order, class: 'OrderEntity' do
serial_number { 'ABC-123456789' }
status { :successed }
puchased_at { Time.zone.now }
comment { nil }
skip_create
initialize_with { new(attributes) }
end
end
接着因为底层使用 Boxenn::Repository
,很好抽换。
# create_order_spec.rb
# 因为 use case 没有用到 rails 因此不需要 require rails_helper
require 'lite_helper'
require 'timecop'
RSpec.describe CreateOrder do
describe '建立订单' do
subject(:result) do
described_class.new(repo: order_repo).call(params: params)
end
let(:order_repo) { instance_double('OrderRepository'), save: true }
let(:params) {{ serial_number: 'XYZ-987654321', status: :successed, puchased_at: Time.zone.today, comment: '测试' }}
# 因为测试有时间性,因此利用 timecop 冻结时间
before(:example) do
Timecop.freeze(Time.zone.now)
end
after(:example) do
Timecop.return
end
# 需要安装 wisper-rspec 才可以测 pub-sub
it '发布 event' do
expect { result }.to publish(:order_created)
end
it '新建订单' do
expect(result.success?).to be_true
expect(order_repo).to have_received(:save) do |order|
expect(order.to_h).to include(expected_order.to_h)
end
end
end
def expected_order
create(
:entity_order,
serial_number: 'XYZ-987654321',
status: :successed ,
puchased_at: Time.zone.today,
comment: '测试',
)
end
end
下一篇会来聊聊 Boxenn::UseCase
遇到的问题。
前言 接下来多篇的元件介绍会以官方文件 Components In-Depth 章节为主: 未知pa...
我们在定义类别或结构时,有时候会需要做初始化的动作,简单说,就是给一个值,譬如我们在写C的时候,如果...
“In man's struggle against the world, bet on the ...
原本是计画要2020换工作,结果因为疫情的关系打算延後了一年在开始投履历跟面试~ 时间线 2021 ...
这题写凌晨2、3点,本来要用c的,最後用JAVA,然後睡觉前送出去Time Limit Exceed...