Rspec: 如何测试控制器操作创建时调用的服务对象方法"call"?

Rspec: how to test Service Object method "call" which is called in Controller action create?

有人可以帮我 rspec 测试服务对象中的方法调用吗?

 class UserEntitiesController < ApplicationController
    
      def create
    
        @result = UserEntities::Create.new(params).call
        return render '/422.json.jbuilder', status: :unprocessable_entity unless @result
      end

这里是服务对象:

 module UserEntities
  class Create
    attr_accessor :params
    def initialize(params)
      @params = params
    end

    def call
      @user_entity = UserEntity.new(user_entity_params)
      set_time

      if @user_entity.save
        @user_entity
      else
        error_result
      end
    end

    private

    def error_result
      false
    end

    def user_entity_params
      @params.require(:user_entity).permit(:information,
                                           :destroy_option,
                                           :reviews)
    end

    def set_time
      if @params[:available_days].present?
        @user_entity.termination = Time.now + @params[:available_days].days
      end
    end
  end
end

我试图查找如何执行此操作的信息,但没有那么多。 我也读了一些

您当然可以编写单元测试来测试 Service Object 独立

在这种情况下,创建一个文件spec/services/user_entities/create_spec.rb

describe UserEntities::Create do
  let(:params) { #values go here } 

  context ".call" do
    it "create users" do
      UserEntities::Create.new(params).call
      # more test code
    end

    # more tests
  end
end

稍后在控制器测试中,如果您打算编写这样的代码,则无需测试 UserEntities::Create,您只需将服务对象模拟为 return 所需的结果

describe UserEntitiesController do
  before do
    # to mock service object in controller test
    allow(UserEntities::Create).to receive(:new)
     .and_return(double(:UserEntities, call: "Some Value"))
  end

  # controller tests go here
end

作为@bibin 回答的补充。 如果你想模拟一些实例的方法,请返回:

allow_any_instance_of(UserEntities::Create).to receive(:call).and_return("some value")

如果你想报错:

allow_any_instance_of(UserEntities::Create).to receive(:call).and_raise("boom")