ruby - tests - run spec rails
¿Para qué es el método doble en rspec? (2)
En rspec doc se indica que debería usar el método double
para crear el doble de prueba. Pero puedo ver que funciona perfectamente bien incluso si no uso el double
. ¿Hay algo de malo en no usar el double
? Además, si no estoy usando el doble, ¿cómo MyClass
recibe stub
y otros métodos de rspec? ¿Están disponibles para todos los objetos cuando se ejecuta en rspec?
require ''spec_helper''
class MyClass
def self.run
new.execute
end
def execute
''foo''
end
end
describe MyClass do
it ''should stub instance method'' do
obj = MyClass.new
obj.stub(:execute).and_return(''bar'')
obj.execute.should == ''bar''
end
it ''should stub class method'' do
MyClass.stub(:run).and_return(''baz'')
MyClass.run.should == ''baz''
end
end
Con RSpec Mocks 3.0, el comportamiento de los dobles ha cambiado. Ahora puede verificar los dobles , lo que significa que "RSpec verificará que los métodos que se repiten estén realmente presentes en el objeto subyacente si está disponible", pero "no se verificará si el objeto o clase subyacente no está definido".
La verificación de dobles solicita que sea específico sobre el tipo doble (instancia, clase, objeto, clase dinámica, parcial). Aquí hay un ejemplo de RSpec Relish para una instancia doble:
RSpec.describe User, ''#suspend!'' do
it ''notifies the console'' do
notifier = instance_double("ConsoleNotifier")
expect(notifier).to receive(:notify).with("suspended as")
user = User.new(notifier)
user.suspend!
end
end
Editar: Acabo de volver a leer tu pregunta y me di cuenta de que no la había respondido del todo. Dejando mi respuesta original porque está relacionada, pero esta es su respuesta específica:
La razón por la que no necesitas un doble es porque estás anotando métodos de clase, en lugar de métodos de instancia. double
solo es útil para tratar instancias de la clase, no la clase misma.
Respuesta anterior que explica el doble más:
Siempre debes usar clases reales en lugar de dobles de prueba cuando puedas. Esto ejercerá más de su código y hará que sus pruebas sean más completas. Los dobles de prueba se usan en situaciones donde no puedes o no debes usar un objeto real. Por ejemplo, si no se puede crear una instancia de una clase sin tocar un recurso externo (como una red o una base de datos), o tiene una gran cantidad de dependencias, y solo está probando algo que la use, es posible que desee crear una clase. doble y algunos métodos en el doble.
Aquí hay un ejemplo más específico: digamos que está probando MyClass
, pero para crear una instancia de MyClass
, debe pasar un FooLogger
:
mylogger = FooLogger.new
myclass = MyClass.new logger: mylogger
Si FooLogger.new
abre un socket de syslog y comienza a enviarlo de manera inmediata, cada vez que ejecute sus pruebas, estará FooLogger.new
sesión. Si no desea enviar sus registros de correo no deseado durante esta prueba, puede crear un doble para FooLogger
y FooLogger
un método en él:
mylogger = double(FooLogger)
mylogger.stub(:log)
myclass = MyClass.new logger: mylogger
Debido a que la mayoría de las clases bien diseñadas se pueden crear instancias sin ningún tipo de efecto secundario, generalmente puede usar el objeto real en lugar de un doble y los métodos auxiliares en ese lugar. Hay otros escenarios en los que las clases tienen muchas dependencias que hacen que sea difícil crear instancias, y los dobles son una forma de superar el problema y probar lo que realmente te importa.
En mi experiencia, la necesidad de usar un doble es un olor a código, pero a menudo tenemos que usar clases que no podemos cambiar fácilmente (por ejemplo, de una joya), por lo que es una herramienta que puede necesitar de vez en cuando.