2016-09-19 35 views
2

在我的代碼,我測試的對象是特定的類的實例,但是實例雙打是一類RSpec::Mocks::InstanceVerifyingDouble如何驗證rspec instance_double作爲doubled類的實例?

一個人爲的例子是...

# spec 
@double = instance_double Foo 
allow(Bar).to receive(:foo).and_return @double 

# lib 
until Bar.foo.instance_of? Foo 
    # logic to test 
    if something == true 
    Bar.foo = Foo.new 
    else 
    Bar.foo = nil 
    end 
end 

有什麼辦法操縱rspec double來模擬課程?或者我需要返回一個實際的Foo實例嗎?

UPDATE 我的意思是說,他們的方式我目前得到解決該問題,是這樣的......

# spec 
allow(Bar).to receive(:foo).and_return Foo.allocate 

# lib 
if Bar.foo.instance_of? Foo 
    # do something 
end 

我很好的這種解決方案,因爲在初始化符不實際執行,但我寧願使用rspec /雙打一致性

UPDATE 更改爲示例(希望)更清晰。我需要測試something的結果,VS結果爲Bar.foo寫作人爲的例子很難:)

回答

0

當然。你可以存根#instance_of?返回你想要的。

@double = instance_double Foo 
allow(@double).to receive(:instance_of?).with(Foo).and_return(true) 
allow(Bar).to receive(:foo).and_return @double 
+0

so ...設置'Bar.foo'返回的代碼是想要測試,而不是調用'instance_of?'...以便測試通過,但它不會測試我想測試的內容 – brewster

+0

我很困惑。我認爲這是關於設置測試,以便運行'#do something'代碼並且可以測試。如果你正在測試'Bar.foo'的返回值,你爲什麼要對它進行存根? (如果您在示例中添加了更多內容,例如您想要通過的測試以及要測試的內容,這可能會有所幫助。 –