【发布时间】:2017-03-30 10:00:47
【问题描述】:
Rails 控制器的一个动作创建了一个辅助类的实例(比如SomeService),它执行一些工作并返回一个结果,类似于:
def create
...
result = SomeService.new.process
...
end
我想存根 SomeService#process 返回的内容。
我的问题是 - 我该怎么做?
以下作品:
allow_any_instance_of(SomeService).to receive(:process).and_return('what I want')
但是,rspec-mock 文档不鼓励将allow_any_instance_of 用于reasons states here:
rspec-mocks API 是为单个对象实例设计的,但此功能可在整个对象类上运行。因此,存在一些语义上令人困惑的边缘情况。例如,在 expect_any_instance_of(Widget).to receive(:name).twice 中,不清楚每个特定实例是否应该接收 name 两次,或者是否预期两个接收总数。 (是前者。)
使用此功能通常带有设计味道。可能是您的测试试图做的太多,或者被测对象太复杂。
它是 rspec-mocks 中最复杂的功能,历史上收到的错误报告最多。 (核心团队没有人积极使用它,这无济于事。)
我认为这个想法是做这样的事情:
some_service = instance_double('SomeService')
allow(some_service).to receive(:process).and_return('what I want')
但是,如何让控制器使用双精度而不是创建新实例
SomeService?
【问题讨论】:
标签: ruby-on-rails rspec double stub rspec-mocks