Rspec: ошибка / ошибка: ожидаемо (qbase). To have_received (: with_user_id) .with (1) - PullRequest
0 голосов
/ 25 сентября 2019

Как определить, вызвал ли экземпляр CarQuery метод с определенным параметром?(Я предполагаю, что это моя проблема, но, пожалуйста, скажите мне, если я ошибаюсь).

Есть ли лучший способ проверить это?

Ошибка

Search#base_filters should call with_limit method on query_object when user_id is passed in
     Failure/Error: expect(qbase).to have_received(:with_user_id).with(1)

       (Double "CarQuery").with_user_id(1)
           expected: 1 time with arguments: (1)
           received: 0 times

Поисковый запрос

class Search
  def self.call(current_user, params)
    new(current_user, params).call
  end

  def initialize(current_user, params)
    @params = params
    @current_user = current_user
  end

  def call
    base_filters(CarQuery.new(@current_user)).relation
  end

  private

  def base_filters(query_object)
    query_object.with_user_id(@params[:user_id]) if @params[:user_id].present?
    query_object
  end
end

Rspec Test

RSpec.describe Search, type: :model do
  describe "#base_filters" do
    it "should call with_limit method on query_object when user_id is passed in" do

      current_user = create(:user)
      qbase =spy('CarQuery')
      expect(qbase).to have_received(:with_user_id).with(1)
      Search.call(current_user, {user_id: 1})
    end
  end
end

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Решено с помощью внедрения зависимостей

Если есть лучшее решение, пожалуйста, отправьте его.

Поисковый запрос

class Search
  def self.call(current_user, params, query_object_override = nil)
    new(current_user, params, query_object_override).call
  end

  def initialize(current_user, params, query_object_override = nil)
    @params = params
    @current_user = current_user
    @query_object = query_object_override
  end

  def call
    base_filters(query_object).relation
  end

  private

  def query_object
    @query_object ||= CarQuery.new(@current_user)
  end

  def base_filters(query_object)
    query_object.with_user_id(@params[:user_id]) if @params[:user_id].present?
    query_object
  end
end

Тест Rspec

RSpec.describe Search, type: :model do
  describe "#base_filters" do
    it "should call with_user_id method on query_object when user_id is passed in" do

      current_user = create(:user)
      query_object = spy('CarQuery')
      Search.call(current_user, {user_id: 1}, query_object)
      expect(query_object).to have_received(:with_user_id )
    end
  end
end
0 голосов
/ 25 сентября 2019

Необходимо вызвать метод для шпиона, чтобы он работал

Если вы используете шпиона, вам нужно вызвать метод и проверить, был ли метод получен.См. Rspec документацию по шпионам здесь .Или же вы можете использовать двойной.Они оба похожи, но нельзя ожидать, что двойник будет работать точно так же, как шпион.

RSpec.describe Search, type: :model do
  describe "#base_filters" do
    it "should call with_limit method on query_object when user_id is passed in" do
      current_user = create(:user)
      qbase =spy('CarQuery')
      qbase.with_user_id(1) # <-------- you need to add this line here first
      ## but does qbase even have a method called 'with_user_id'? if not,
      ## it will still fail
      expect(qbase).to have_received(:with_user_id).with(1) 
      # If you don't add the line above, of course it will fail, 
      ## you haven't sent qbase any messages! It won't work otherwise.
      ## I'm not sure what the line below is doing in relation to your tests?
      Search.call(current_user, {user_id: 1})
    end
  end
end
...