Mientras escribía pruebas, dejé de intentar probar el Servicio en otro Servicio. En tal situación, probablemente debería verificar si se ha llamado al Servicio porque ya se probó en otro lugar. Investigué un poco en Internet y encontré algo como have_received pero no tengo idea de cómo usarlo en mi ejemplo.
check_service.rb
Class CheckService def initialize(params) @params = params end def self.call(params) new(params).call end def call CheckUser.call(params[:user_id]) end end check_service_spec.rb
... describe 'call' do let(:result) { CheckService.call(params) } let(:params) { { user_id: "100" } } let(:check_user) { instance_double(CheckUser) } before do allow(check_user).to receive(:call).and_return(true) end it do result expect(check_user).to have_received(:call) end end ...Estaba intentando algo como esto (es un ejemplo simple), pero aparece el error:
(InstanceDouble(CheckUser) (anonymous)).call(*(any args)) expected: 1 time with any arguments received: 0 times with any arguments¿Hay alguna opción para probar la situación que presenté?
Respuesta corta
describe 'call' do let(:result) { CheckService.call(params) } let(:params) { { user_id: "100" } } ## let(:check_user) { instance_double(CheckUser) } delete this before do allow(CheckUser).to receive(:call).and_return(true) end it do result expect(CheckUser).to have_received(:call) end endAlternativa
Creo que una mejor manera de probar esto es usar DI (Inyección de dependencia), por lo que pasa CheckUser como una dependencia a CheckService. ¡Prefiero escribir toda la prueba dentro del bloque it también!
class CheckService def initialize(params, check_handler:) @params = params @check_handler = check_handler end def self.call(params, check_handler: CheckUser) new(params, check_handler: check_handler).call end def call @check_handler.call(@params[:user_id]) end end describe 'call' do it 'check user with params' do check_user = class_double(CheckUser) allow(check_user).to receive(:call).and_return(true) params = { user_id: "100" } CheckService.call(params, check_handler: check_user) expect(check_user).to have_received(:call) end endUna publicación de blog para leer más sobre -> https://blog.testdouble.com/posts/2018-05-17-do-we-need-dependency-injection-in-ruby/