【发布时间】:2019-01-28 22:25:49
【问题描述】:
我正在做一个 Rspec 测试,检查是否使用某些参数调用了 ActiveSupport::Notification.instrument。
问题是,为了使这个测试成为一个需要 FactoryBot 构建一些对象,但是当我试图监视 ActiveSupport::Notification.instrument 时,我总是得到一个错误:
ActiveSupport::Notifications received :instrument with unexpected arguments
expected: (:asd)
got: ("factory_bot.run_factory", {:factory=>#<FactoryBot::Factory:0x005569b6d30, @al... nil, dispatch: nil, distribution_state: 2, main_category_id: nil>}, :strategy=>:build, :traits=>[]})
FactoryBot 似乎调用了 activesupport,所以当我出于测试目的对其进行模拟时,我最终将其模拟得太远了......
代码示例:
类:
class SomeObject
def initialize(something)
#some code
end
def my_method
ActiveSupport::Notifications.instrument :asd
end
end
规格:
describe "#my_method" do
let(:some_object) { build :some_object }
before do
allow(ActiveSupport::Notifications).to receive(:instrument).with :asd
end
it "calls notifier" do
described_class.new(some_object).my_method
expect(ActiveSupport::Notifications).to have_received(:instrument).with :asd
end
end
我怎样才能只模拟我的呼叫而不是 FactoryBot 的。
我只在模拟:asd 之前再添加一个allow:
allow(ActiveSupport::Notifications).to receive(:instrument).and_call_original
还有其他(更好的)方法吗?
【问题讨论】:
标签: ruby rspec factory-bot activesupport rspec-mocks