2016-05-04 5 views
3

Это мой первый файл называется user.pyКак издеваются свойство внутри класса в Python

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 

У меня есть второй файл с именем 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 

Моя цель заключается в проверке user.py. Одна из вещей, которую я хочу сделать, - обмануть объект Account в user.py для декоратора свойств has_discount. Я хочу проверить различные сценарии, где has_discount вернет либо 0, либо любое другое число.

Как это сделать с помощью патча, где я могу издеваться над объектом Account в классе User, чтобы возвращать пользовательские значения, чтобы я мог попробовать разные тесты?

ответ

0

Поскольку user импортирует модуль Account в его собственном пространстве имен patching должно быть сделано там вместо account модуля. Другими словами, вы должны временно изменить то, что имя Account в user модуль относится к:

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 

Я хочу, чтобы проверить различные сценарии, в которых has_discount будет возвращать 0 или любое другое число.

В текущей реализации User.has_discount всегда будет возвращать True или False. Возможно, вы имели в виду Account.discount_id?

Смежные вопросы