2015-07-23 8 views
0

Я пытаюсь написать тест, который вычисляет среднее количество многих записей 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 берет блок, а мой код дает ему аргумент (так как в процессе создания коллекция была бы отношением).

Любые идеи о том, как это сделать?

ответ

0

Вам необходимо указать параметры, которые вы ждете

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