2016-03-17 65 views
1

在RSpec中,你可以使用一個instance_double,以確保您的期望是有效的 - 換句話說,如果我有:Rspec的 - 希望只接收如果方法存在

class Foo 
    def bar 
    end 
end 

我可以做

dbl = instance_double('Foo') 
expect(dbl).to receive(:bar) 
... 

我知道如果我從Foo中刪除bar方法,我的測試會拋出一個錯誤,阻止我悄悄地破壞事情。

我怎樣才能達到與類方法相同的效果?我只是不小心造成的,其我的測試沒有趕上一個錯誤,因爲我做了以下內容:

class Foo 
    def self.bar 
    end 
end 

測試:

expect(Foo).to receive(:baz) 
Foo.baz 

沒有錯誤提出了,因爲我通過上面的預期增加了一個存根,但真的那種方法不存在。我知道我可以做class_double,但Foo.baz在我的代碼的另一部分被調用,而不是在我的測試中,所以我不能讓它調用class_double而不是實際的類。

+0

爲什麼要嘲笑它呢? 'expect(Foo).to respond_to(:bar)' – max

+0

我不測試它是否響應bar,我測試它被其他代碼調用 – jtmarmon

回答

1

你想要做什麼是打開部分雙驗證:

RSpec.configure do |config| 
    config.mock_with :rspec do |mocks| 
    mocks.verify_partial_doubles = true 
    end 
end 

這將導致部分雙打有相同的行爲,通過object_double創建雙打。

相關問題