2013-09-25 37 views
1

我有我的控制器是這樣定義的函數:如何使用RSpec編寫一個存根調用塊並且不返回值的Rails方法?

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 |中?

+0

回覆:「我可以在沒有阻擋的情況下調用它,如果我想要的話」 - 沒有阻止的情況下調用'respond_with'的目的是什麼?定義還有更多嗎? –

+0

想一想,爲它提供一個塊的目的是什麼,因爲它們沒有'yield'或塊的調用? –

+0

當我寫這個,我試圖給它一個正確的名字。我最好稱它爲perform_something_and_respond_with_if_user_provides_a_block。 :) – valk

回答

1

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

例如描述的「產量匹配」,你可以這樣做:

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

,如果你只是想檢查該塊被調用一次用MyResponse參數。

+0

謝謝,我的答案也有效,但這看起來更乾淨。 – valk

+1

我剛剛提出了你的問題,因爲這真的很混亂!其中一部分是舊的與新的RSpec風格,但我認爲根本無法檢查傳遞給接受塊的函數的參數,並且檢查函數是否正確地返回塊。看起來你只能爲給定的執行做一個或另一個。 –

1

而不是

.and_return(something) 

我用:

.and_yield(api_response_mock) 

,沒有工作。並且由於塊獲得響應對象,所以gem rspec-mocks在這裏很方便。

+0

是的,這證實了控制器接收到方法調用,但是不是驗證控制器是否正確生成,而是控制收益行爲。 :-) –

相關問題