Python - Перемешивание вызовов функций

У меня есть следующее утверждение в одном из тестируемых методов.

db_employees = self.db._session.query(Employee).filter(Employee.dept ==   
    new_employee.dept).all()

Я хочу, чтобы db_employees получал фиктивный список сотрудников. Я пытался добиться этого, используя:

 m = MagickMock()
 m.return_value.filter().all().return_value = employees

, где сотрудники - это список объектов сотрудников. Но это не сработало. Когда я пытаюсь напечатать значение какого-либо атрибута, он имеет фиктивное значение. Вот как выглядит код:

class Database(object):
    def __init__(self, user=None, passwd=None, db="sqlite:////tmp/emp.db"):
        try:
            engine = create_engine(db)
        except Exception:
            raise ValueError("Database '%s' does not exist." % db)

        def on_connect(conn, record):
            conn.execute('pragma foreign_keys=ON')

        if 'sqlite://' in db:
            event.listen(engine, 'connect', on_connect)
        Base.metadata.bind = engine
        DBSession = sessionmaker(bind=engine)
        self._session = DBSession()


class TestEmployee(MyEmployee):
    def setUp(self):
        self.db = emp.database.Database(db=options.connection)
        self.db._session._autoflush()

    @mock.patch.object(session.Session, 'add')     
    @mock.patch.object(session.Session, 'query')  
    def test_update(self, mock_query, mock_add):
        employees = [{'id': 1,
                      'name': 'Pradeep',
                      'department': 'IT',
                      'manager': 'John'}]
        mock_add.side_effect = self.add_side_effect
        mock_query.return_value = self.query_results()  
        self.update_employees(employees)

    def add_side_effect(self, instance, _warn=True):
        // Code to mock add
        // Values will be stored in a dict which will be used to 
        // check with expected value.

    def query_results(self):  
        m = MagicMock()  
        if self.count == 0:  
             m.return_value.filter.return_value.all.return_value = [employee]  
        elif:  
             m.return_value.filter.return_value.all.return_value = [department]  
        return m  

У меня есть query_results, поскольку тестируемый метод вызывает запрос дважды. Сначала таблица сотрудников, а затем таблица отделов.

Как мне посмеяться над этим вызовом функции?

9
задан Pradeep 16 December 2015 в 13:12
поделиться