【问题标题】:Stubbing validation on an ActiveRecord across the RSpec test suite跨 RSpec 测试套件对 ActiveRecord 进行存根验证
【发布时间】:2016-02-09 04:35:11
【问题描述】:

我有一个 ActiveRecord 对象,它在大约 50% 的 RSpec 套件中创建/保存。 除了我明确测试验证行为的上下文之外,我想在整个套件中对它的验证进行存根。

为了实现这一点,我使用 config 将其全局存根

config.before(:each) do
  allow_any_instance_of(Activerecord::Abc).to receive(:abc_validate).and_return(true)
end

然后在特定上下文中覆盖存根

context "Validations" do
  context "abc_validate" do
    before :each do
      allow_any_instance_of(Activerecord::Abc).to receive(:abc_validate).and_call_original
    end

    it "should ..... " do
      ........
    end
  end
end

这符合我的要求。但是,它效率不高,因为虽然我只需要大约 50% 的 RSpec 测试套件的存根,但我实际上是为每个单元测试都存根它。即使是不需要存根的单元测试也会有存根函数。

有没有更好的方法?

我想到了另一种方法:我可以在 RSpec 中重新打开类并覆盖自定义验证函数本身,而不是对方法进行存根。

Activerecord::Abc.class_eval do
  def abc_validate(testing_self = false)
    testing_self ? super : true
  end
end

但是,这种方法感觉太老套了。

版本详情 -

  1. Rails 4.2.4
  2. Rspec 3.3.0

【问题讨论】:

  • 存根对我来说似乎很好。我一直在为整个测试套件做这种事情。您是否担心存根会显着降低测试套件的速度?

标签: ruby-on-rails ruby unit-testing rspec tdd


【解决方案1】:

我个人不喜欢在整个套件中使用无效的模拟对象的想法。我认为它很容易出现错误,因为测试会将对象视为有效对象,并且可能会使用暴露其无效性的对象的功能,从而导致误报。

因此,我建议您在整个测试过程中使用 valid 对象来扭转局面,期望您在其中测试它的创建和验证的特定上下文。

如果创建一个有效对象需要大量设置,您可以使用fixtures 或FactoryGirl gem 将这个逻辑集中在一个地方。创建一个有效的对象将是一个简单的调用FactoryGirl.create(:abc)的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多