Я пытаюсь написать тест, который вычисляет среднее количество многих записей db без накладных расходов на собственно чтение/запись в db.RSpec: Кажется, что не заглушен ActiveRecord :: QueryMethods # select
Вот метод:
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
двойники набора маршрутов для возвращения массивов двойников полета, я столкнулся с проблемой, так как массив отвечает #select
иначе, чем ActiveRecord Relation (как это было бы действительно так), поэтому я попытался заглушить массивы и flights2
, чтобы вернуть их отображаемые времена вылета. Тем не менее, когда я запускаю мой тест, который я до сих пор получаю эту ошибку: заглушки для 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'
. Ошибка по-прежнему вызывает метод ActiveRecord #select
в моем массиве удвоений и неудача, потому что Array#select
берет блок, а мой код дает ему аргумент (так как в процессе создания коллекция была бы отношением).
Любые идеи о том, как это сделать?