RSpec & Tire gem: тест для шин:: Результаты:: Коллекция

Попытка понять синтаксис для тестирования вокруг драгоценного камня Тира.

Эта спецификация контроллера (по умолчанию из шаблона скаффолда) не работает

  describe "GET index" do
    it "assigns all reports as @reports" do
      report = Report.create! valid_attributes
      get :index, {}, valid_session
      assigns(:reports).should eq([report])
    end
  end

так как

 Failure/Error: assigns(:reports).should eq([report])
 TypeError:
   can't convert Tire::Results::Collection to Array (Tire::Results::Collection#to_ary gives Tire::Results::Collection)

Как написать спецификацию, чтобы она ожидала коллекцию результатов Tire вместо массива активных объектов записей? Или есть лучший способ сделать это?

FWIW-

class ReportsController < ApplicationController  
  def index
    @reports = Report.search(params)
  end

  ...

и модель:

class Report < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks
  ...
  def self.search(params)
    tire.search(load: true) do
      query { string params[:query] } if params[:query].present?
    end
  end
  ...

1 ответ

Решение

Я понимаю, что это безумно поздний ответ, но эй, здесь идет.

Rspec делает прямое сравнение. У него есть коллекция, и он пытается сравнить ее с массивом. Однако Tire определяет приведение к массиву, чтобы фактически не возвращать массив (почему, я не уверен, это звучит раздражающе для меня!)

Учитывая, что вы не должны сравнивать массив, я быстро взглянул на источник Collection: https://github.com/karmi/tire/blob/master/lib/tire/results/collection.rb

Ну, у нас нет полезного to_ary... но у нас есть каждый и включение Enumerable. Это означает, что у нас есть практически все, что доступно для массива.

Итак, учитывая это, что мы на самом деле хотим сделать здесь? Мы хотим проверить, что @report доступен внутри @reports. Ну, у нас есть перечислимый, и быстрая проверка источника ожиданий ( https://github.com/rspec/rspec-expectations/blob/master/lib/rspec/matchers/built_in/include.rb#L38) говорит, что карту будет включать? на массивном объекте.

Итак, короче, попробуйте изменить свой тест на:

describe "GET index" do
  it "assigns all reports as @reports" do
   report = Report.create! valid_attributes
   get :index, {}, valid_session
   assigns(:reports).should include(report)
  end
end
Другие вопросы по тегам