假设您有一个销售小部件的购物网站。但是,每个小部件的库存都是有限的,因此保持“widget.number_still_available”数字是最新的非常重要。
我想按照
的方式编写一个rspec测试it "always displays the correct number still available" do
# Assume there is a before method that sets up a widget with 5 available
widget.number_still_available.should == 5
# User "a@b.com" purchases 2 widgets
widget.number_still_available.should == 3
# User "c@d.com" purchases 1 widget
widget.number_still_available.shhould == 2
# User "a@b.com" cancels purchase of 1 widget
widget.number_still_available.should == 4
end
我希望能够编写执行“购买”和“取消”方法的仅测试方法。由于各种原因,这些操作与我的模型中的任何“真实”方法都不对应(最重要的是,PHP中有一个解耦的后端系统执行部分购买和取消操作)。
使用RSpec时放置此代码的正确位置在哪里?在黄瓜中,我可以写几个步骤 - 但我不确定RSpec的正确等价物是什么。
答案 0 :(得分:45)
我建议在spec/support
中创建一个名为purchase_helpers.rb
的新文件,并将此内容放入其中:
module PurchaseHelpers
def purchase_widgets(user, count=1)
# Code goes here
end
def cancel_purchase(user, count=1)
# Code goes here
end
end
RSpec.configure do |c|
c.include PurchaseHelpers
end
这样做的好处而不是把它放到spec/spec_helper.rb
中是因为它并没有把这个文件与许多不相关的RSpec代码集中在一起。将事情分开是更好的做事方式。
答案 1 :(得分:2)
您可以将monkeypatch放入 spec_helper.rb ,或直接放在spec文件的顶部(如果它仅用于该文件)。
使用现有的类方法创建辅助方法,而不是对类进行monkeypatching将更加清晰和安全。