【问题标题】:RR Mock method called, but spec still fails调用了 RR 模拟方法,但规范仍然失败
【发布时间】:2012-09-19 19:46:19
【问题描述】:

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

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

【问题讨论】:

  • 您是否缺少设置订阅 = 模拟(订阅)的部分?
  • 你能发布你的相关控制器代码吗?您没有正确分配模拟,这就是它调用的原因。
  • 抱歉,我没有意识到您正在使用 RR。不知道我知道这里有什么问题。

标签: ruby-on-rails rspec mocking rr


【解决方案1】:

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

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 的任何实例上被调用。不是很好,但就我的目的而言,它可以工作。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多