2014-07-18 83 views
0

我有一個方法,我想測試一個特定的對象正在調用。然而,識別這個對象有點複雜,因爲我對這個對象的特定實例不感興趣,而是符合某些條件。複雜的RSpec參數測試

例如,我的代碼可能是這樣的:

some_complex_object = ComplexObject.generate(params) 
my_function(some_complex_object) 

而在我的測試中,我要檢查

test_complex_object = ComplexObject.generate(test_params) 
subject.should_receive(:my_function).with(test_complex_object) 

但我肯定知道,比較some_complex_objecttest_complex_objectComplexObject#==將返回false因爲這是期望的行爲(其他地方我依靠標準==行爲,所以不想超載它爲ComplexObject)。

我認爲這是一個問題,我發現自己需要編寫這樣的測試,並且寧願重新構造代碼,以便我不需要編寫這樣的測試,但不幸的是這個測試更大這個任務需要重寫很多現有的代碼,因此是一個長期的修復,我想在時間限制內完成,但現在無法完成。

有沒有一種方法可以讓Rspec在測試中的參數之間做更復雜的比較?理想情況下,我希望能夠使用塊的內容,以便可以編寫任意比較代碼。

+0

這是否有幫助? http://apidock.com/rspec/Spec/Mocks/ArgumentMatchers/duck_type –

+0

nope,需要做值比較,而不僅僅是檢查對象是否響應某些東西 –

回答

1

https://www.relishapp.com/rspec/rspec-mocks/v/2-7/docs/argument-matchers的信息,你如何能夠提供塊做的傳遞給方法的參數的任意分析,如:

expect(subject).to receive(:my_function) do |test_complex_object| 
    # code setting expectations on test_complex_object 
end 

您也可以自定義一個匹配,這將讓您評估對象看看是否符合條件,如https://www.relishapp.com/rspec/rspec-expectations/v/2-3/docs/custom-matchers/define-matcher

+0

,因爲我最初寫這個問題,我已經在一些地方切換到rspec 3,它還支持可以接受任意塊的可嵌套的「滿足」匹配器 –