我有一個對象測試has_one關係?
class User < ActiveRecord::Base
has_one :subscription
end
,我有這樣的測試:
it "should increment shipped count when item_shipped" do
@user.attributes = @valid_attributes
@user.save
subscription = mock_model(Subscription)
subscription.stub!(:item_shipped!)
subscription.stub!(:user_id)
@user.subscription = subscription
lambda{@user.item_shipped!}.should change{@user.shipped_count}.by(1)
end
但我得到一個錯誤:
1)
Spec::Mocks::MockExpectationError in 'User should increment shipped count when item_shipped'
Mock "Subscription_1113" received unexpected message :[]= with ("user_id", 922717357)
./spec/models/user_spec.rb:29:
我不知道如何嘲笑了這一點,我似乎無法找到任何這類事情的參考。
謝謝...這似乎不工作,但這可能是因爲item_shipped的內部工作原因!我確實需要模擬訂閱,因爲它是從我正在測試的方法中調用的。 – phil 2010-10-07 13:17:13
是的,如果不知道方法的細節,很難說。請記住,mock旨在用於創建特定的期望。換句話說,如果你的規範不會斷言某個模擬對象上的某個方法會被調用,那麼就沒有必要嘲笑那個對象。只需將任何方法存入實際的對象實例中,以調用沉重的操作或其他不需要的操作。正如Martin Fowler指出的那樣,mock不是存根:http://martinfowler.com/articles/mocksArentStubs.html – 2010-10-07 19:14:32
還要記住,如果用戶希望在用戶#item_shipped!內部的訂閱中返回值,需要在存根方法上設置返回值(請參閱編輯)。 – 2010-10-07 19:19:49