Estoy tratando de burlarme de algo mientras pruebo una aplicación Django usando la biblioteca de pruebas Mock con nombre imaginativo . Parece que no puedo hacer que funcione, estoy tratando de hacer esto:
models.py
from somelib import FooClass
class Promotion(models.Model):
foo = models.ForeignKey(FooClass)
def bar(self):
print "Do something I don't want!"
test.py
class ViewsDoSomething(TestCase):
view = 'my_app.views.do_something'
def test_enter_promotion(self):
@patch.object(my_app.models.FooClass, 'bar')
def fake_bar(self, mock_my_method):
print "Do something I want!"
return True
self.client.get(reverse(view))
¿Qué estoy haciendo mal?
bar
es de hecho un "método de instancia" y su único parámetro esself
. Para ser un método de clase, tendría que estar parametrizado concls
y sería invocable comoPromotion.foo()
.@patch.object('my_app.models.FooClass', 'bar')
cls
, pero lo que es más importante (ya queself
ycls
no significa nada especial en python), decorado con@classmethod
Respuestas:
Para agregar a la respuesta de Kit, especificar un tercer argumento
patch.object()
permite especificar el objeto / método simulado. De lo contrario,MagicMock
se utiliza un objeto predeterminado .def fake_bar(self): print "Do something I want!" return True @patch.object(my_app.models.FooClass, 'bar', fake_bar) def test_enter_promotion(self): self.client.get(reverse(view)) # Do something I want!
Tenga en cuenta que, si se especifica el objeto burla, el valor por defecto
MagicMock()
es no pasó en el objeto parcheado - por ejemplo, ya no:def test_enter_promotion(self, mock_method):
pero en vez:
def test_enter_promotion(self):
http://www.voidspace.org.uk/python/mock/patch.html#patch-object
fuente
Ah, estaba confundido sobre dónde aplicar ese decorador de parches. Fijo:
class ViewsDoSomething(TestCase): view = 'my_app.views.do_something' @patch.object(my_app.models.FooClass, 'bar') def test_enter_promotion(self, mock_method): self.client.get(reverse(view))
fuente
mock_method
pasado a la función de prueba. He podido utilizar esta técnica en una de mis pruebas. Esto es útil cuando solo desea verificar si se llamó al método simulado.