堆栈: Rails 3.0.7, Mongoid 2.2.5, RSpec 2.11.0, RR 1.0.4
我有一个如下所示的订阅模型:
class Subscription
include Mongoid::Document
embeds_many :addons
after_save :update_feature_policy!
def update_feature_policy!
puts "Updating feature policy!"
end
end
我有一个看起来像这样的规范:
it "should update FeaturePolicy when adding an addon" do
puts "Starting spec"
mock(subscription).update_feature_policy! { true }
subscription.addons << user_addon
puts "Finished spec"
end
规范失败,但我在控制台中看到以下输出:
Starting spec
Updating feature policy!
Finished spec
Failure/Error: mock(subscription).update_feature_policy! { true }
RR::Errors::TimesCalledError:
update_feature_policy!()
Called 0 times.
Expected 1 times.
是什么导致模拟对象无法捕获方法调用并通过规范?
似乎回
调正在重新查找记录并创建一个单独的订阅实例(因此不会命中模拟对象)。 我不确定为什么 - 似乎它的性能不是很好 - 但我找到了解决方法:
it "should update FeaturePolicy when adding an addon" do
puts "Starting spec"
mock.instance_of(Subscription).update_feature_policy! { true }
subscription.addons << user_addon
puts "Finished spec"
end
这将检查在任何Subscription
实例上调用update_feature_policy!
。 不是很好,但就我的目的而言,它有效。
如果有人能回答为什么会发生这种情况或提供更好的解决方案,请这样做。