2010-05-24 12 views
17

? Al igual que this question, yo también estoy usando nifty_scaffold de Ryan Bates. Tiene el aspecto deseable de usar el método any_instance de Mocha para forzar un estado "inválido" en objetos modelo enterrados detrás del controlador.¿Hay alguna manera de deshacer el troquelado de Mocha de any_instance en Test :: Unit

A diferencia de la pregunta a la que me he vinculado, no estoy usando RSpec, pero Test :: Unit. Eso significa que las dos soluciones centradas en RSpec no funcionarán para mí.

¿Existe alguna forma general (es decir: funciona con Test :: Unit) para eliminar el trozo de cualquier instancia? Creo que está causando un error en mis pruebas, y me gustaría verificarlo.

Respuesta

31

Si llega el caso, Mocha 0.10.0 permite unstubbing on any_instance().

str = "Not Stubbed!" 
String.any_instance.stubs(:to_s).returns("Stubbed!") 
puts str.to_s # "Stubbed!" 
String.any_instance.unstub(:to_s) 
puts str.to_s # "Not Stubbed!" 
4

Mocha no proporciona tal funcionalidad. Sin embargo, puede implementarlo usted mismo.

Lo primero que debemos saber sobre mocha es que mocha en realidad reemplaza los métodos originales cuando los une. Entonces, para poder restaurar estos métodos más tarde, debe mantener una referencia a los anteriores. Se puede lograr fácilmente por: alias new_method old_method. Debe hacerse antes de burlarse del old_method.

Ahora, para desbloquear un método, solo necesita alias old_method new_method.

Considere el siguiente código:

class A 
    def a 
     true 
    end 
end 


class TestA < Test::Unit::TestCase 
    def test_undo_mock 
     a = A.new 
     A.class_eval {alias unmocked_a a} 

     A.any_instance.stubs(:a).returns("b") 
     assert a.a, "b" 

     A.class_eval {alias a unmocked_a} 
     assert a.a, "a" 
    end 
end 
+0

Excelente. Esto parece algo que podría agregarse/monopatched en Mocha también. –

+0

Nunca he sentido la necesidad de esta funcionalidad, pero hay un boleto: http://floehopper.lighthouseapp.com/projects/22289-mocha/tickets/69-allow-unstubbing-of-methods si desea presionar por el cambio Sería genial si tienes algunos ejemplos de por qué quieres usarlo. –

+0

He agregado la funcionalidad de liberación - Mocha :: ObjectMethods # unstub - ver http://mocha.rubyforge.org/classes/Mocha/ObjectMethods.html#M000009 –

0

Si desea eliminar todos sus talones de/expectativas de una sola vez, entonces usted puede hacer que el uso de mocha_teardown (por ejemplo. Self.mocha_teardown llamar).

Puede ser un poco destructivo en este caso, sin embargo.

Cuestiones relacionadas