0

堆栈: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.

是什么导致模拟对象不捕获方法调用并通过规范?

4

1 回答 1

0

回调似乎正在重新查找记录并创建一个单独的订阅实例(因此没有命中模拟对象)。我不知道为什么 - 似乎它的性能不是很好 - 但我找到了一个解决方法:

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

这会检查是否update_feature_policy!在 的任何实例上被调用Subscription。不是很好,但就我的目的而言,它有效。

如果有人可以回答为什么会发生这种情况或提供更好的解决方案,请这样做。

于 2012-09-20T18:32:10.287 回答