2009-11-23 51 views
9

我現在有一些期望建立與連續調用一個模擬:RSpec的:期待一個消息多次,但具有不同的參數

該規範:

@my_mock = mock("a_mock") 
@options1 = {:some => "option"} 
@options2 = {:some_other => "option"} 
@first_param = mock("first_param") 

@my_mock.should_receive(:a_message).with(@first_param, @options1) 
@my_mock.should_receive(:a_message).with(@first_param, @options2) 

不過,我得到以下幾點:

Mock "a_mock" received :a_message with unexpected arguments 
    expected: (#<Spec::Mocks::Mock:0x81b8ca3c @name="first_param"{:some => "option"}) 
    got: (#<Spec::Mocks::Mock:0x81b8ca3c @name="first_param">, {:some_other => "option"}) 

當我調試這個時,第一個期望會被調用。在使用相同信息但不同參數預計連續呼叫之前,是否必須指定其他任何信息?

+0

當我嘗試你的例子時,它適用於我。你正在運行什麼版本的Ruby和RSpec? – 2009-11-23 21:17:59

回答

9

嘗試創建您的模擬爲null對象,以忽略額外的方法調用。你的每一個期望仍然必須得到滿足,但是他們不會互相推step。

@my_mock = mock("a_mock").as_null_object 

這跟在Null Object模式,其中任何無關的消息被忽略。當你想確保一個方法被某些參數調用時,它是有用的,但你不關心它是否被其他參數調用,或者是否有其他方法被調用。

+0

這確實有幫助。不過,我不確定這是做什麼。你可以解釋嗎? – manlycode 2009-11-24 15:16:05

+0

我更新了我的答案,並附加了一些關於空對象的額外信息。我不是一個模式或測試專家,但我希望它有一點幫助。 – Baldu 2009-11-24 16:06:17

相關問題