【发布时间】: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
但是,这种方法感觉太老套了。
版本详情 -
- Rails 4.2.4
- Rspec 3.3.0
【问题讨论】:
-
存根对我来说似乎很好。我一直在为整个测试套件做这种事情。您是否担心存根会显着降低测试套件的速度?
标签: ruby-on-rails ruby unit-testing rspec tdd