1

私はRSpecが初めてです。検索コントローラーをテストしたい。コントローラーで検索メソッドをスタブしようとしましたが、常に失敗します。

 Failure/Error: expect(Doctor).to receive(:search).with(search_param)
   (<Doctor(id: integer, name: string, address: string, phone: string, is_active: boolean, field_id: integer, created_at: datetime, updated_at: datetime, email: string, encrypted_password: string, reset_password_token: string, reset_password_sent_at: datetime, remember_created_at: datetime, sign_in_count: integer, current_sign_in_at: datetime, last_sign_in_at: datetime, current_sign_in_ip: inet, last_sign_in_ip: inet, roles: integer, description: text, avatar_file_name: string, avatar_content_type: string, avatar_file_size: integer, avatar_updated_at: datetime, avatar_processing: boolean, title: string, valid_doctor: boolean, verification_photo_file_name: string, verification_photo_content_type: string, verification_photo_file_size: integer, verification_photo_updated_at: datetime) (class)>).search("rizky")
       expected: 1 time with arguments: ("rizky")
       received: 0 times

Searchkick を隔離する正しい方法は何ですか?

コントローラーでの検索方法は次のとおりです。

def search
    @doctors = []
    keyword = params[:keyword]
    @doctors = call_search_in_doctor(keyword) if keyword.present?
    respond_to do |format|
      format.json { render json: @doctors, status: 200 }
      format.html { render 'users/search/index.html.haml', status: 200 }
    end
end

def call_search_in_doctor(keyword)
  Doctor.search keyword,
                misspellings: { edit_distance: 3 },
                page: params[:page],
                per_page: 10,
                limit: 100,
                fields: [{ name: :word },
                         { name: :word_start },
                         { name: :word_middle },
                         { name: :word_end },
                         :code, :field_name]
end

そして、ここに私のコントローラーテストがあります:

context 'with keyword' do
  let(:search_param) { "rizky" }
  let(:doctor) { instance_double(Doctor) }
  let(:results) { instance_double(Searchkick::Results) }

  before do
    allow(Doctor).to receive(:search).with(search_param) {:results}
  end

  it 'calls Doctor.search' do
    get :search, search_param
    expect(Doctor).to receive(:search).with(search_param)
  end
end

貴重な時間をありがとう!

4

1 に答える 1

1

RSpec はそれDoctor.searchが呼び出されなかったと言っているのではなく、指定した引数で呼び出されなかったと言っています。製品コードはDoctor.search2 つの引数 (検索語とパラメーターのハッシュ) で呼び出しますが、テストDoctor.searchでは 1 つの引数 (検索語) のみで呼び出すことができます。

次のいずれかで修正できます

  • テストの呼び出しに 2 番目の引数を追加するwith(そのハッシュが何であるかを確認するテストに関連すると思われる場合)、または
  • これらの呼び出しに の 2 番目の引数を追加しanythingます (ハッシュがテストに無関係であり、単に無視したい場合)
于 2016-03-13T21:43:52.410 に答える