gpt4 book ai didi

ruby-on-rails - Controller 规范中的测试/模拟 worker

转载 作者:太空宇宙 更新时间:2023-11-03 17:52:02 24 4
gpt4 key购买 nike

我有一个在 Controller 操作中创建的工作人员。 worker 实例化另一个服务对象。我已经测试了工作人员和服务对象,但我想测试 Controller 操作是否正确初始化了工作人员。我在概念上很难理解我应该 mock 什么以及这样做的语法。

我的 worker 看起来像这样:

class RepoWorker 
def perform(user)
# business logic
RepositorySyncer.new(user)
end
end

我的 Controller 看起来像这样:

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

有两种方法可以实现您想要的效果。使用 stub 链(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com