phi*_*hil 5 rspec ruby-on-rails
我有一个对象
class User < ActiveRecord::Base
has_one :subscription
end
Run Code Online (Sandbox Code Playgroud)
我有这个测试:
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
Run Code Online (Sandbox Code Playgroud)
但我收到错误:
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:
Run Code Online (Sandbox Code Playgroud)
我不知道如何模拟这一点,而且我似乎找不到任何对此类事情的引用。
不要模拟订阅,而是尝试在实际订阅上删除方法:
subscription = Subscription.new
subscription.stub!(:item_shipped!)
subscription.stub!(:user_id)
@user.subscription = subscription
Run Code Online (Sandbox Code Playgroud)
模拟可能很脆弱。任何对模拟的调用都必须被预期并声明为期望。无论如何,这个特定的测试似乎都不需要模拟该模型。
编辑:还记得声明调用类所依赖的任何返回值。在你的情况下,这可能看起来像:
subscription.stub!(:item_shipped!).and_return(true)
subscription.stub!(:user_id).and_return(@user.id)
Run Code Online (Sandbox Code Playgroud)
ETC。
同样,如果您没有断言应该调用模拟模型上的方法,那么模拟在这里所做的唯一事情就是使您的测试变得脆弱。模拟适用于以下情况:
subscription.should_receive(:some_method).once
Run Code Online (Sandbox Code Playgroud)
否则,您只需删除那些具有与您的规范无关的不良副作用的方法即可。
归档时间: |
|
查看次数: |
1577 次 |
最近记录: |