我似乎遇到過文獻暗指使用RSpec的any_instance_of
方法(例如expect_any_instance_of
)是不好的做法。津津有味的文檔甚至在「使用遺留代碼」一節(http://www.relishapp.com/rspec/rspec-mocks/v/3-4/docs/working-with-legacy-code/any-instance)下列出了這些方法,這意味着我不應該利用這個編寫新代碼。測試在新實例上調用方法的函數的「正確」方法是什麼?
我覺得我經常編寫依賴此功能的新規格。一個很好的例子是創建一個新實例然後調用一個方法的任何方法。 (在Rails這裏爲MyModel是一個ActiveRecord)我經常寫做類似下面的方法:
def my_method
my_active_record_model = MyModel.create(my_param: my_val)
my_active_record_model.do_something_productive
end
我一般寫我的規格尋找do_something_productive
被稱爲與使用expect_any_instance_of
的。例如:
expect_any_instance_of(MyModel).to receive(:do_something_productive)
subject.my_method
唯一的其他辦法,我可以看到符合規範,這將是有這樣一羣存根:
my_double = double('my_model')
expect(MyModel).to receive(:create).and_return(my_double)
expect(my_double).to receive(:do_something_productive)
subject.my_method
不過,我認爲這更糟糕的是因爲)它的長,慢寫,和b)它比第一種方式更加脆弱和白色。爲了說明第二點,如果我改變my_method
以下幾點:
def my_method
my_active_record_model = MyModel.new(my_param: my_val)
my_active_record_model.save
my_active_record_model.do_something_productive
end
那麼規範斷裂的雙版本,但any_instance_of
版本的作品就好了。
所以我的問題是,其他開發人員如何做到這一點?我的方法使用any_instance_of
皺眉了嗎?如果是這樣,爲什麼?
你現在在'create_productively'方法中有沒有完全相同的問題? –
如果除了在模型上創建和調用方法之外,主題還有更多的功能,這將會更加明顯。但無論如何看到我的更新。 –
我的意思是,你現在如何測試'create_productively'。我看不出這有何幫助。也許我只是想念它。 –