【发布时间】:2016-05-12 17:37:02
【问题描述】:
我似乎遇到过文献暗示使用 RSpec 的 any_instance_of 方法(例如 expect_any_instance_of)是不好的做法。 relish 文档甚至在“使用遗留代码”部分 (http://www.relishapp.com/rspec/rspec-mocks/v/3-4/docs/working-with-legacy-code/any-instance) 下列出了这些方法,这意味着我不应该利用它编写新代码。
我觉得我经常编写依赖此功能的新规范。一个很好的例子是任何创建一个新实例然后调用它的方法的方法。 (在 MyModel 是 ActiveRecord 的 Rails 中)我经常编写方法来执行以下操作:
def my_method
my_active_record_model = MyModel.create(my_param: my_val)
my_active_record_model.do_something_productive
end
我通常会在编写规范时寻找使用expect_any_instance_of 调用的do_something_productive。例如:
expect_any_instance_of(MyModel).to receive(:do_something_productive)
subject.my_method
我能看到的唯一其他方法是使用一堆像这样的存根:
my_double = double('my_model')
expect(MyModel).to receive(:create).and_return(my_double)
expect(my_double).to receive(:do_something_productive)
subject.my_method
但是,我认为这更糟糕,因为 a) 它的写入时间更长且速度更慢,并且 b) 它比第一种方式更易碎和更白。为了说明第二点,如果我将my_method 更改为以下内容:
def my_method
my_active_record_model = MyModel.new(my_param: my_val)
my_active_record_model.save
my_active_record_model.do_something_productive
end
然后规范的双重版本中断,但any_instance_of 版本工作正常。
所以我的问题是,其他开发人员是如何做到这一点的?我使用any_instance_of 的方法是否令人不悦?如果是这样,为什么?
【问题讨论】:
标签: ruby-on-rails ruby unit-testing testing rspec