ruby - bot - rspec in rails 5
¿Cómo puedo simular super en ruby usando rspec? (2)
No puedes burlarte de super
, y no deberías. Cuando te burlas de algo, estás verificando que se recibe un mensaje en particular, y super
no es un mensaje, es una palabra clave.
En cambio, averigüe qué comportamiento de esta clase cambiará si falta la super
llamada y escriba un ejemplo que ejerza y verifique ese comportamiento.
Estoy extendiendo una biblioteca existente creando una clase secundaria que se extiende a la clase de biblioteca.
En la clase infantil, pude probar la mayoría de las funciones en el método de initialize
, pero no pude simular una super
llamada. La clase infantil se parece a algo como abajo.
class Child < SomeLibrary
def initialize(arg)
validate_arg(arg)
do_something
super(arg)
end
def validate_arg(arg)
# do the validation
end
def do_something
@setup = true
end
end
¿Cómo puedo escribir la prueba rspec (con mocha) de manera que pueda simular una super
llamada? Tenga en cuenta que estoy probando la funcionalidad del método de initialize
en la clase Child
. ¿Tengo que crear una ruta de código separada que no llame a super
cuando se proporciona un argumento extra?
Una buena manera de probar esto es establecer una expectativa de alguna acción tomada por la superclase - ejemplo:
class Some::Thing < Some
def instance_method
super
end
end
y la super clase:
class Some
def instance_method
another_method
end
def self.another_method # not private!
''does a thing''
end
end
ahora prueba:
describe ''#instance_method'' do
it ''appropriately triggers the super class method'' do
sawm = Some::Thing.new
expect(sawm).to receive(:another_method)
sawm.instance_method
end
end
Todo lo que determina es que a Super se le llamó en la Superclase
La utilidad de este patrón depende de cómo estructure sus pruebas / qué expectativas tiene de la mutación de la clase hijo / derivada mediante el método super
que se aplica.
Además, preste mucha atención a class
métodos de class
e instance
, tendrá que ajustar los allows
y las expects
consecuencia.
YMMV