tests run rails how ruby-on-rails rspec

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)