Rspec:间谍无法检测到方法调用(我的模式是错误的)

问题描述 投票:0回答:1

我如何测试在另一个方法中正在调用一个方法?

我需要测试ListingQuery.call()是否调用base_filter方法

代码

module ListingsQuery
  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
      @type = params[:market] || params[:type] || "all"
      @current_user = current_user
      @type = if @type.present?
                @type.downcase.singularize
              else
                "listing"
              end
      @query_object = query_object_override
    end

    def call
      relation_for(query_object)
    end

    private

    def relation_for(query_object_instance)
      if query_object_instance.class == ListingsQuery::Car
        car_filters(query_object_instance).relation
      else
        raise ArgumentError, "ListingsQuery 'Class: #{query_object_instance.class}' does not exist"
      end
    end

    def car_filters(query_object)
      base_filters(query_object)
      other_filters(query_object)
      query_object
    end

    def query_object
      @query_object ||= query_object_for(@type, @current_user) # => ListingQuery::Car
    end
  end
end

###测试

  current_user = spy("User")
  query_object_class = ListingsQuery::Car
  query_object = spy(query_object_class.name)

  allow_any_instance_of(RSpec::Mocks::Double).to receive(:class) { query_object_class }
  allow_any_instance_of(ListingsQuery::Search).to receive(:base_filter) { query_object }
  so = ListingsQuery::Search.call(current_user, {}, query_object)
  expect(so).to have_received(:base_filters)

错误

 1) ListingsQuery::Search#car_filters should call base_filters
     Failure/Error: expect(so).to have_received(:base_filters)

       (Double "ListingsQuery::Car").base_filters(*(any args))
           expected: 1 time with any arguments
           received: 0 times with any arguments
ruby-on-rails ruby rspec rspec-rails
1个回答
0
投票

我认为您正在将变量so分配给ListingsQuery::Search.call(current_user, {}, query_object)的结果。这可能有效:

so = ListingsQuery::Search
so.call(current_user, {}, query_object)
expect(so).to have_received(:base_filters)

或我通常的书写方式:

so = ListingsQuery::Search
expect(so).to receive(:base_filters)
so.call(current_user, {}, query_object)
© www.soinside.com 2019 - 2024. All rights reserved.