2016-05-04 8 views
3

Dies ist meine erste Datei namens user.pyWie in einer Klasse in Python eine Eigenschaft verspotten

from account import Account  
class User: 
    def __init__(self, id): 
     self.id = id 
     self._account = None 

    @property 
    def account(self): 
     if not self._account: 
      self._account = Account(self.id) 

     return self._account 

    @property 
    def has_discount(self) 
     return self.account.discount_id > 0 

I account.py

class Account: 
    def __init__(self, user_id): 
     # some process to load DB data 
     self.account = load_account(user_id) 
     # do something after this to initialize account properties like discount, etc 

    @property 
    def discount_id(self): 
     return self.discount_id 

Mein Ziel eine zweite Datei namens zu testen benutzer.py. Ich möchte unter anderem das Account-Objekt in user.py für den Property-Designer "has_discount" mokieren. Ich möchte verschiedene Szenarien testen, in denen has_discount entweder 0 oder eine andere Zahl zurückgibt.

Wie mache ich das mit Patch, wo ich das Account-Objekt in der User-Klasse spotten kann, um benutzerdefinierte Werte zurückzugeben, damit ich verschiedene Tests ausprobieren kann?

Antwort

0

Da das user Modul importiert Account in einem eigenen Namespace patching muss dort anstelle der account Modul durchgeführt werden. Mit anderen Worten müssen Sie vorübergehend, was der Name Account im user Modul bezieht sich ändern:

from user import User 
from unittest.mock import patch 

with patch('user.Account') as MockAccount: 
    MockAccount.return_value.discount_id = 1 
    u = User(1)        
    print(u.has_discount) 
    # True 

with patch('user.Account') as MockAccount: 
    MockAccount.return_value.discount_id = 0 
    u = User(1) 
    print(u.has_discount) 
    # False 

ich verschiedene Szenarien testen wollen, wo has_discount entweder 0 oder jede andere Zahl zurück.

In der aktuellen Implementierung User.has_discount wird immer entweder True oder False zurückzukehren. Meinst Du Account.discount_id?

Verwandte Themen