如何使用RSpec为存储块调用块并且不返回值的Rails方法编写存根?

时间:2013-09-25 21:03:33

标签: ruby-on-rails rspec block

我的控制器中有一个这样定义的函数:

def respond_with(action = 0, &block)
  if block_given?
    response = get_response
    block.call( MyResponse.new(response) )
  end
end

我可以查询响应对象:

respond_with do |response|
  case response.status
  when 'ok'
  when 'errors'
   #etc etc...
end

如果我愿意,我可以在没有阻止的情况下调用它。

如果我有一个返回值的函数,那就像

controller.should_receive(:respond_with).with(DO_SOMETHING).and_return(something)

可以
def respond_with(action = 0)
  ...
  response
end

如何在| response |中检查是否使用特定值调用了块?

2 个答案:

答案 0 :(得分:1)

而不是

.and_return(something) 

我用:

.and_yield(api_response_mock)

这就是工作。由于块获得了响应对象,因此gem rspec-mocks在这里很方便。

答案 1 :(得分:1)

您使用https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/yield-matchers#yield-with-args-matcher

中所述的“yield matcher”

例如,你可以这样做:

expect {|b| controller.respond_with(&b)}.to yield_with_args(MyResponse)

如果您只想检查该块是否使用MyResponse参数调用了一次。