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")
有人可以帮我 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")