Tengo un usuario de objeto ActiveRecord. En la aplicación que estoy creando, estoy usando un inicio de sesión único en la gema, pero necesito guardar algunos de los datos del usuario en nuestra base de datos. Mi ApplicationController tiene este código:

def create_user
  User.create(name: current_user['name'], email: current_user['email'], company_id: current_user['id'])
end

Necesito una prueba RSpec que simule la llamada create real. Yo he tratado

allow_any_instance_of(User).to receive(:create).with(any_args).and_return(user)

Que devuelve un error que dice "El usuario no implementa crear".

3
Mr Robot Arms 1 sep. 2016 a las 18:35

2 respuestas

La mejor respuesta

Jvillian tiene razón en que el problema es que create es implementado por User, no por una instancia de User. La solución simple es simplemente copiar el método directamente en User (es decir, usar allow en lugar de allow_any_instance_of):

allow(User).to receive(:create).with(any_args).and_return(user)

Además, .with(any_args) no es una operación, por lo que esto es equivalente:

allow(User).to receive(:create).and_return(user)
3
Dave Schweisguth 1 sep. 2016 a las 17:11

Creo que allow_any_instance_of espera una instancia de User para implementar create. create, sin embargo, es un método de clase . Entonces, creo que los mensajes de error dicen que las instancias de User no implementan create.

Sugeriría ver si class_double funciona para su caso de uso. Consulte Rspec Mocks y < a href = "https://stackoverflow.com/questions/30848877/how-to-stub-a-class-method-using-rspec-rspec-mocks"> esta SO publicación de Myron Marston.

2
Community 23 may. 2017 a las 12:16