我正在尝试将Geocoder gem引入的每个ActiveRecord结果的别名存根。我正在使用Factory Girl来模拟记录。
在我的控制器中,我使用near
方法查找附近的一些场地。我正在嘲笑near
方法并返回由Factory girl创建的结果:
let(:origin) { [...] }
let(:venue) { build(:venue)
...
expect(Venue).to receive(:near).with(origin).and_return([venue] * 5)
这一切都很好,但在我看来,我希望能够获取从原点到场地的距离:
- @nearest_venues.each do |venue|
= "#{venue.name}, #{'%.2f' % venue.distance} miles"
然而,这会爆炸,因为distance
不是由场地模型实现的。起初我以为我可以使用Factory Girl特征为结果添加一个距离属性,但出于同样的原因,这将失败。
我对RoR很新,所以我知道我可能会试图将方钉推入圆孔!
答案 0 :(得分:0)
您似乎可能正在考虑将应用程序的不同组件一起测试(更多用于集成/验收级别测试,例如由Capybara提供)。如果您查看rspec-rails文档,我认为您会找到一些很好的示例,例如此处的模型规范(类似于您的Venue测试):
http://www.rubydoc.info/gems/rspec-rails/#Model_Specs
或者在这里查看测试:
http://www.rubydoc.info/gems/rspec-rails/#View_specs
这些测试不同的东西 - 视图规范更关注渲染和变量赋值等,而模型规范专注于计算之类的东西,类似于你的测试。
这里介绍了模拟和存根:
http://www.rubydoc.info/gems/rspec-mocks/
当然,您可以使用目标方法(如distance
)创建一个普通的旧Ruby类,并将其用作测试双精度。