2013-07-11 29 views
3

我有接收復數參數(HTML字符串)的功能。我要檢查這個字符串,即:rspec的:「should_receive」與多個參數的期望

receiver.should_receive(:post_data).with(json_content).with(id_matching(5)) 

with參數不起作用,任何替代多個條件?如果能夠以某種方式製作複合材料,我很高興定義自定義匹配器。

很顯然,我可以運行相同的測試多次和測試有關的結果不同的事情,但是這是一個集成測試這需要幾秒鐘的運行,所以我不想讓它更慢。

感謝

編輯:

撰稿時,接受的答案(使用自定義描述定製的匹配),似乎是最好的選擇。然而,它是不完美的,理想的with會支持的概念「,這是預期的類型的項目,但沒有我們預期的一個人,而不是一個純粹的二進制匹配。

回答

3

您需要提供自定義匹配,但你可以很容易地定義你的錯誤報告,讓你能給什麼失敗,爲什麼細節。見https://github.com/dchelimsky/rspec/wiki/Custom-Matchershttp://solnic.eu/2011/01/14/custom-rspec-2-matchers.html

特別是,如https://github.com/rspec/rspec-mocks「參數匹配器」部分第一段最後一句所述,自定義匹配器將作爲參數提供給with

至於錯誤報告,沒有適用於此用例的自定義失敗方法,但使用自定義匹配器的description方法生成顯示爲「預期」值的字符串,雖然不是它的目的,但可以被定義爲輸出任何你想要的關於失敗的匹配。

+0

第二個鏈接看起來非常有用。我已經看到了第一個,它沒有提供關於複雜匹配器的詳細信息。明天我會有一場比賽,看看我能否拿出一個合理的匹配器。 – Stefan

+0

+1是相關的,但它不完全回答這個問題。 'with'的行爲與'should'有點不同。自定義匹配器應該會報告爲什麼它不匹配。然而,'with'似乎要等到它收到一個匹配的參數。如果不匹配,rspec只報告不匹配的參數是什麼。即似乎沒有辦法爲'with'定義自定義失敗消息。雖然我很高興被證明是錯誤的! – Stefan

+0

我同意這有區別。我更新了答案,以反映自定義匹配會出現(即作爲參數傳遞給標準'with'法),但仍然留下錯誤消息的問題。儘管這是一種黑客攻擊,但您可以修改自定義匹配器的「description」方法,以輸出關於失敗匹配的任何信息。當「with」報告它失敗時,這個方法就是「預期:」後面使用的方法。由於在rspec代碼中沒有定義'failure_message_for_with',我懷疑這可能是唯一的「鉤子」。 –

7

也許你甚至不需要自定義匹配器,並且塊形式對您來說已經足夠了。

receiver.should_receive(:post_data) do |*args| 
    json_content = args.first 
    json_content.should_not be_empty 
    json_content.should include "some string" 
end 

見RSpec的嘲弄文檔,部分Arbitrary Handling