[DAY22] Boxenn Use Case Spec

Use Case Spec

这边以之前的 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 遇到的问题。


<<:  Day23 Vue 认识Porps(2)

>>:  Day23 CSS转场动画Transition

[Part 1 ] Vue.js 的精随-元件

前言 接下来多篇的元件介绍会以官方文件 Components In-Depth 章节为主: 未知pa...

Day 10 Swift语法-进阶篇(3/5)-Initialization

我们在定义类别或结构时,有时候会需要做初始化的动作,简单说,就是给一个值,譬如我们在写C的时候,如果...

卡夫卡的藏书阁【Book28】- Kafka - MirroMaker

“In man's struggle against the world, bet on the ...

2021 — 找工作 (上)

原本是计画要2020换工作,结果因为疫情的关系打算延後了一年在开始投履历跟面试~ 时间线 2021 ...

找LeetCode上简单的题目来撑过30天啦(DAY20)

这题写凌晨2、3点,本来要用c的,最後用JAVA,然後睡觉前送出去Time Limit Exceed...