3

次のメソッドのロジックがクエリが渡されるかどうかに関係なく機能することをテストするモデル仕様で、いくつかのテストを作成しようとしています。

models/payment.rb

  include PgSearch
  pg_search_scope :search, 
                  :against            => [:id, :transaction_id],
                  :using              => {:tsearch => {:prefix => true, :dictionary => "english"}},
                  :associated_against => {user: [:email, :name]}

  def self.text_search(query)
    if query.present?
      search(query)
    else
      scoped
    end
  end

ここに、私が書こうとしている種類のテストの例を示しますが、これを達成するための最良の方法を空白にしています。

/spec/models/payment_spec.rb

describe '#text_search' do

  it "works when query is passed in" do
    payments = Payment.text_search(stub(:query))
    payments.should_not be_nil
    # is this even a good test??
  end

  it "still works if nothing is passed in" do
    payments = Payment.text_search(nil)
    payments.should_not be_nil
    # same here, does this spec test for anything helpful??
  end
end
4

1 に答える 1

0

まず、クエリが提供されているかどうかにかかわらず、メソッドが「機能する」かどうかをテストしたいと言うとき、「機能する」とはどういう意味かを決定する必要があります。

実際の検索を実行して結果を確認する場合は、テスト ダブルは必要ありませんが、search使用する真正なクエリを渡す必要があり、結果が正確であることを確認する方が明らかに効果的です。ではなく、あなたが期待したものnil

それを確認したい場合は、適切に呼び出されsearchscopedいる場合は、a のスタブを渡して、andqueryに期待値を設定できます (たとえば、呼び出された引数とは何か)。それぞれに戻り値を指定して、メソッドがその値を返すことを確認することもできます。searchscoped

少なくとも最初の例に関しては、ハイブリッド アプローチのようなものがあります。物事をどの方向に進めるかを決める必要があります。

それが役立つことを願っています。上記を決定し、ドキュメントを参照した後に実際のコードを作成する際に支援が必要な場合は、コメントでフォローアップの質問をしてください。

于 2013-10-01T20:06:46.550 に答える