ruby on rails - run - Cómo especificar un método privado
rspec rails (3)
Para los métodos privados que necesitan cobertura de código (ya sea temporal o permanentemente), use la gema rspec-context-private para hacer públicos temporalmente los métodos privados dentro de un contexto.
gem ''rspec-context-private''
Funciona agregando un contexto compartido a su proyecto.
RSpec.shared_context ''private'', private: true do
before :all do
described_class.class_eval do
@original_private_instance_methods = private_instance_methods
public *@original_private_instance_methods
end
end
after :all do
described_class.class_eval do
private *@original_private_instance_methods
end
end
end
Luego, si pasa :private
como metadatos a un bloque de describe
, los métodos privados serán públicos dentro de ese contexto.
class Example
private def foo
''bar''
end
end
describe Example, :private do
it ''can test private methods'' do
expect(subject.foo).not eq ''bar''
end
end
Tengo un modelo con un método privado que me gustaría especificar con RSpec,
como lo haces usualmente ¿Solo pruebas el método llamando al privado?
¿O también la especificación privada? Si es así, ¿cómo lo haces?
Si desea probar una expectativa en un método privado, la respuesta aceptada no funcionará (al menos no que yo sepa, así que estoy abierto a la corrección en ese punto). Lo que he hecho, en cambio, es aún más sucio: en la prueba en sí, simplemente exponga el método redefiniéndolo:
def object_to_test.my_private_method
super
end
Funciona en Ruby 1.8, no puedo comentar sobre ninguno de los tiempos de ejecución más nuevos.
Siempre tomo este enfoque: quiero probar la API pública que expone mi clase.
Si tiene métodos privados, solo los llama desde los métodos públicos que expone a otras clases. Por lo tanto, si prueba que los métodos públicos funcionan como se espera en todas las condiciones, también ha demostrado que los métodos privados que usan también funcionan.
Admito que me he topado con algunos métodos privados especialmente complejos. En ese caso extremo que quiera probarlos, puede hacer esto:
@obj.send(:private_method)