2012-09-11 61 views
3

尝试了解围绕轮胎宝石进行测试的语法。RSpec&轮胎宝石:测试轮胎::结果::收集

该控制器规范(默认从脚手架模板)未能

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) 

如何编写规范,这样,预计轮胎结果集合,而不是一个数组活动记录对象?或者,有没有更好的方法去解决这个问题?

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 
    ... 
+0

<蟋蟀.....> – Meltemi

回答

2

我意识到这是一个疯狂迟到的回答,但是,嘿,在这里不用。

Rspec正在做一个直接的比较。它有一个集合,它试图将它与数组进行比较。然而,Tire将演员阵列定义为阵列并不实际返回阵列(为什么,我不确定,听起来令人讨厌!)

由于您不是要比较阵列,因此我有一个阵列快速查看收集源:https://github.com/karmi/tire/blob/master/lib/tire/results/collection.rb

那么,我们没有to_ary这是有用的......但我们确实有一个,并且包含Enumerable。这意味着我们基本上有一切可用于数组。

那么,鉴于此,我们究竟想在这里做什么?我们要检查@report是否在@reports中可用。那么,我们有enumerable,并快速检查期望源(https://github.com/rspec/rspec-expectations/blob/master/lib/rspec/matchers/built_in/include.rb#L38)说,包括将映射到包括?在一个arrayesque对象上。

因此,简而言之,试着改变你的测试:

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 
+0

总比不做好迟到了!好答案!谢谢! – Meltemi