3

Tire gem をテストするための構文を理解しようとしています。

このコントローラー仕様 (scaffold テンプレートのデフォルト) は失敗しています

  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
  ...
4

1 に答える 1

2

これはめちゃくちゃ遅い答えだと思いますが、ねえ、ここに行きます。

Rspec は直接比較を行っています。コレクションがあり、それを配列と比較しようとしています。ただし、Tire は配列へのキャストを定義して、実際には配列を返さないようにしています (なぜ、よくわかりませんが、私にはうっとうしく聞こえます!)

配列を比較するつもりはないので、 Collection のソースをざっと見てみました: https://github.com/karmi/tire/blob/master/lib/tire/results/collection.rb

便利な to_ary はありませんが、each はあり、Enumerable が含まれています。これは、基本的に配列で利用できるすべてのものがあることを意味します。

では、ここで実際に何をしたいのでしょうか。@report 内で @report が使用可能であることを確認します。さて、私たちは列挙可能であり、期待ソース(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
于 2013-01-21T18:40:08.460 に答える