2011-04-24 13 views
10

¿Es posible tener un side_effect en una propiedad? Si miro la documentación de Mock, parece que solo es posible en los métodos de objeto.Python: Mock side_effect on object attribute

estoy tratando de probar lo siguiente:

def get_object(self): 
    try: 
     return self.request.user.shop 
    except Shop.DoesNotExist: 
     return None 

Quiero tienda a elevar una excepción DoesNotExist.

Supongo que no estaba lo suficientemente claro, pero estoy hablando de la biblioteca de simulación de espacio vacío.

http://www.voidspace.org.uk/python/mock/index.html

+0

¿Cuál es la pregunta ??? –

+0

¿Es posible tener un side_effect en una propiedad? – Pickels

+0

Bueno, quiero saber si es posible tener un side_effect (función de la biblioteca de simulacro) en la propiedad de un objeto simulado. En la documentación solo muestran ejemplos haciendo esto en métodos. Como en mi tienda de códigos no se llama, el efecto secundario no funciona. Si todavía tiene problemas para entender la pregunta, puedo elaborarla aún más. – Pickels

Respuesta

4

Sí, se puede utilizar una propiedad para ello:

In [1]: class ShopDoesNotExist(Exception): 
    ...:  pass 
    ...: 

In [2]: class User(object): 
    ...:  @property 
    ...:  def shop(self): 
    ...:   raise ShopDoesNotExist 
    ...: 
    ...: 

In [3]: u = User() 

In [4]: u.shop 
--------------------------------------------------------------------------- 
ShopDoesNotExist       Traceback (most recent call last) 
+0

¿Hay alguna manera de hacerlo en una instancia de una clase? – Pickels

+0

¿Por qué debería agregar una propiedad a una sola instancia? Si lo quiere condicional, simplemente use 'if' en el método de su propiedad. – ThiefMaster

+0

Entonces puedo reemplazar el taller durante la prueba para plantear esa excepción. – Pickels

6

Vale la pena señalar que ahora existe la clase PropertyMock:

>>> m = MagicMock() 
>>> p = PropertyMock(side_effect=ValueError) 
>>> type(m).foo = p 
>>> m.foo 
Traceback (most recent call last): 
.... 
ValueError 

Ese ejemplo fue taken from the official site.

4

También puede intentar parchear el campo relacionado usando PropertyMock como argumento new_callable.

Ejemplo:

from unittest import TestCase 
import mock 
from django import models 
from django.core.exceptions import ObjectDoesNotExist 

class Foo(models.Model): 
    # ... 
    @property 
    def has_pending_related(self): 
     try: 
      return self.related_field.is_pending 
     except ObjectDoesNotExist: 
      return False 

class FooTestCase(TestCase): 
    # ... 
    @mock.patch.object(Foo, 'related_field', new_callable=mock.PropertyMock) 
    def test_pending_related(self, related_field): 
     related_field.side_effect = ObjectDoesNotExist 
     foo = Foo() 
     self.assertFalse(foo.has_pending_related)