【发布时间】: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