【问题标题】:RSpec: Can't seem to stub ActiveRecord::QueryMethods#selectRSpec:似乎无法存根 ActiveRecord::QueryMethods#select
【发布时间】:2015-07-23 19:55:16
【问题描述】:

我正在尝试编写一个测试来计算许多数据库记录的平均值,而无需实际读取/写入数据库的开销。

方法如下:

class Average::Route
  def self.daily_flight_count
    Route.active.map do |r|
      times = r.flights.select('distinct depart_time').count
      (times / 7.0).round
    end.average
  end
end

该方法获取所有路线每天的唯一出发时间数量,然后对其进行平均,以获得平均路线的每日航班数。

我正在这样设置我的测试:

require 'rails_helper'

describe Average::Route do
  describe '.daily_flight_count' do
    it 'returns the average daily flight count of all routes' do
      flights1 = (1..7).inject([]) do |arr, n|
        arr << double(Flight, depart_time: Time.now + n.days)
      end

      flights2 = (1..7).inject([]) do |arr, n|
        arr << double(Flight, depart_time: Time.now + n.days)
        arr << double(Flight, depart_time: Time.now + n.days)
      end

      r1 = double(Route, flights: flights1)
      r2 = double(Route, flights: flights2)

      allow(Route).to receive(:active).and_return([r1, r2])
      allow(flights1).to receive(:select).and_return(flights1.map(&:depart_time))
      allow(flights2).to receive(:select).and_return(flights2.map(&:depart_time))

      expect(Average::Route.daily_flight_count).to eq(1)
    end
  end
end

根据 r1 和 r2 如何将 Route 设置为返回 Flight 双精度数组的双精度,我遇到了一个问题,因为数组对 #select 的响应与 ActiveRecord 关系不同(它的实际行为方式) ,所以我尝试存根 flights1 和 flights2 数组以返回它们映射的出发时间。但是,当我运行测试时,我仍然会收到此错误:

Failures:

  1) Average::Route.daily_flight_count returns the average daily flight count of all routes
     Failure/Error: expect(Average::Route.daily_flight_count).to eq(1)
     ArgumentError:
       Wrong number of arguments. Expected 0, got 1.
     # ./app/models/average/route.rb:14:in `block in daily_flight_count'
     # ./app/models/average/route.rb:13:in `map' 

flights1 和 flights2 的存根似乎不起作用。错误仍然在我的双打数组上调用 ActiveRecord #select 方法并失败,因为Array#select 需要一个块并且我的代码给它一个参数(因为在生产中该集合将是一个关系)。

关于如何使它工作的任何想法?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord rspec stub


    【解决方案1】:

    您需要指定您期望的参数

     allow(flights1).to receive(:select).with('distinct depart_time').and_return(flights1.map(&:depart_time))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多