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