我有一个在控制器操作中创建的工作线程工作机实例化另一个服务对象。我已经测试了worker和service对象,但是我想测试controller操作是否正确初始化了worker我在概念上无法理解我应该模仿什么以及这样做的语法。
我的工人看起来是这样的:
class RepoWorker
def perform(user)
# business logic
RepositorySyncer.new(user)
end
end
我的控制器是这样的:
class SessionsController < ApplicationController
def create
# business logic
RepoWorker.new.async.perform(user)
redirect_to root_path
end
end
我想我的测试应该是这样的,但我不能完全让它工作。
it 'create a job to sync repos with github' do
expect(RepoWorker).to receive(:perform)
post :create, provider: :github
end
我正在使用rspec mocks 2.14.1。
最佳答案
问题是当你写
expect(RepoWorker).to receive(:perform)
你真的希望这样:
RepoWorker.perform
有两种方法可以实现你想要的。使用短链(https://www.relishapp.com/rspec/rspec-mocks/v/3-0/docs/message-expectations/message-chains-in-the-expect-syntax):
expect(RepoWorker).to receive_message_chain(:new, :async, :perform)
或使用任何_实例(https://www.relishapp.com/rspec/rspec-mocks/v/3-0/docs/message-expectations/expect-a-message-on-any-instance-of-a-class):
expect_any_instance_of(RepoWorker).to receive(:perform)
编辑:
对于rspec 2.x,两种方法是:
worker = double
RepoWorker.stub_chain(:new, :async).and_return(worker)
expect(worker).to receive(:perform)
RepoWorker.any_instance.should_receive(:perform)
关于ruby-on-rails - 在 Controller 规范中测试/模拟 worker ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22889085/