2016-02-10 29 views
6

我需要驗證我的類的任何實例接收到某個方法,但我不在乎是否有許多實例接收到它們(它們應該)。Rspec - 合併expect_any_instance_of和接收計數

我想是這樣的:

expect_any_instance_of(MyClass).to receive(:my_method).at_least(:once) 

但很顯然,只允許單個實例多次接收方法,但不能用於不同的實例。

有沒有辦法做到這一點?

回答

4

這是rspec-mocks中的一個已知問題。從v3.4 documentationAny instance

RSpec的,嘲笑的API是專爲單個對象實例,不過這個功能對對象的整個類工作。結果有一些語義混淆邊緣情況。例如,在expect_any_instance_of(Widget).to receive(:name).twice中,不清楚特定實例是否預期會接收兩次名稱,或者是否預計有兩次接收總計。 (是前者。)

此外

使用此功能往往是一個設計的氣味。這可能是因爲你的測試試圖做得太多,或者測試對象太複雜。

您有任何方法來重構您的測試或應用程序代碼,以避免「混淆邊緣案例」?也許通過構建一個測試組合並期待它接收消息?

+0

也許通過告訴我的課程,任何新的對象應該是我在測試中創建的特定對象?這是常見的做法嗎? – Mat

+0

這聽起來似乎合理。我不能說話的人氣,但給它一個鏡頭! – messanjah