我有一个对象
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:
我不知道如何嘲笑这个,我似乎无法找到任何对此类事物的引用.
最佳答案 而不是模拟订阅,尝试在实际的订阅上删除方法:
subscription = Subscription.new
subscription.stub!(:item_shipped!)
subscription.stub!(:user_id)
@user.subscription = subscription
模拟可能很脆弱.必须预期对模拟的任何调用并将其声明为期望.似乎这个特定测试似乎不需要在任何情况下模拟该模型.
编辑:还记得声明调用类所依赖的任何返回值.在您的情况下,这可能看起来像:
subscription.stub!(:item_shipped!).and_return(true)
subscription.stub!(:user_id).and_return(@user.id)
等等
同样,如果你没有断言你的模拟模型上的方法应该被调用,那么这里唯一的模拟就是让你的测试变得脆弱.模拟适用于以下内容:
subscription.should_receive(:some_method).once
否则,您只需要找出与您的规范无关的具有不良副作用的方法.