Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

535
Vistas
Rails Rspec: cómo probar si se ha llamado al servicio en otro servicio

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é?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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 end

Alternativa

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 end

Una publicación de blog para leer más sobre -> https://blog.testdouble.com/posts/2018-05-17-do-we-need-dependency-injection-in-ruby/

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda