存根ActiveRecord结果别名

时间:2014-12-15 00:06:04

标签: ruby-on-rails rspec rails-activerecord factory-bot rails-geocoder

我正在尝试将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很新,所以我知道我可能会试图将方钉推入圆孔!

1 个答案:

答案 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类,并将其用作测试双精度。