2010-11-12 4 views
1

Je rencontre des problèmes en se moquant d'un objet pour tester un descripteur.Python: problèmes de se moquer d'une instance

C'est le code du descripteur:

class Text(object): 
    def __init__(self, default_value=u'', validators=[]): 
     self.validators = validators 
     self._value = default_value 

    def __set__(self, instance, value): 
     for validator in self.validators: 
       validator(value).validate() 

c'est le test:

def test_text_validator_raises_exception(self): 
    validator = Mock() 
    validator.validate.side_effect = ValidationError() 
    text = Text(validators=[validator]) 
    self.assertRaises(ValidationError, text__set__, (text, '')) 

Edit: La fonction a() dans le code, je l'ai fait une faute de frappe lors de la copie le code.

L'erreur que j'ai eu était que set() prend exactement 3 arguments. Mais j'ai remarqué dans les réponses que je ne devrais pas passer un tuple comme dernier argument.

Mais cela ne fonctionne pas non plus lorsque j'ai appelé validator (''). Validate() dans la fonction de test.

+3

Et quel est votre problème? – khachik

+0

Désolé, aurait dû être plus clair. – Pickels

Répondre

3
  • validator dans Text est un exemple d'usine d'objet, objet de classe
  • validator dans la fonction test_.. est utilisé comme exemple concret - le produit d'une usine d'objets.

Vous devriez donner à Text() quelque chose qui renvoie des objets avec la méthode .validate pas les objets eux-mêmes:

def test_text_validator_raises_exception(self): 
    validator = Mock() 
    validator.validate.side_effect = ValidationError() 
    text = Text(validators=[Mock(return_value=validator)]) 
    self.assertRaises(ValidationError, text.__set__, text, '') 
+0

C'est en fait ce que j'essayais de demander. Essayait de comprendre comment laisser simuler une classe à la place d'un objet. Dans votre exemple, Mock (return_value = validator) ne renvoie-t-il pas également l'instance de l'objet au lieu de class? – Pickels

+0

J'ai essayé et ça marche, merci beaucoup. Je vais essayer de ne plus poser de questions quand je serai pressé, car tout est un peu désordonné. Merci encore. – Pickels

+1

@Pickels: Considérez: 'f = Mock (return_value = validator)'. Ici 'f' est un objet qui retourne' validator' quand vous l'appelez * par exemple, 'f (value) == validator'. 'f' et' f() 'sont des choses différentes en Python. – jfs

1

Je suppose que vous avez besoin de mettre() après le nom de la fonction

+0

Oui, 'def test_text_validator_raises_exception' a certainement besoin de'() '. – Constantin

+0

Oui, désolé dans mon code la fonction a des parenthèses. – Pickels

0

Peut-être la meilleure façon de se moquer d'une instance est juste « Vous vous appelez un exemple? »

Sérieusement, cependant, def test_text_validator_raises_exception: devrait être def test_text_validator_raises_exception():

Mais quel problème vous avoir avec elle, comme premier intervenant a demandé?

Questions connexes