Ejemplo n.º 1
0
    def setUp(self):
        # mock expression.insert
        # 忽略表模型,直接返回空Insert对象
        mock.patch("sqlalchemy.sql.expression.insert").start()
        expression.insert.return_value = Insert.__new__(Insert)

        # mock Insert.values
        # 用模型对表替代Inserter对象,方便后面的mock
        mock.patch("sqlalchemy.sql.dml.Insert.values").start()

        def insert_user(**kwargs) -> model.User:
            return model.User(id=random.randint(10, 100),
                              account=None,
                              **kwargs)

        Insert.values.side_effect = insert_user

        # mock Session.execute
        # 改为保存到自有集合
        mock.patch("sqlalchemy.orm.Session.execute").start()

        def execute(obj) -> mock.Mock:
            self._inserted[obj.id] = obj
            ret = mock.create_autospec(spec=ResultProxy,
                                       instance=True,
                                       inserted_primary_key=obj.id)
            return ret

        Session.execute.side_effect = execute

        # mock Session.query
        # 忽略表模型,直接返回空Query对象
        mock.patch("sqlalchemy.orm.Session.query").start()
        Session.query.return_value = Query.__new__(Query)

        # mock Query.filter_by.first
        # 改为向自有集合查询
        mock.patch("sqlalchemy.orm.Query.filter_by").start()

        def filter_by(id: int) -> typing.Union[model.User, None]:
            filter = mock.Mock()
            filter.first.side_effect = lambda: self._inserted.get(id)
            return filter

        Query.filter_by.side_effect = filter_by

        # # mock session
        mockedSessionCtx = mock.create_autospec(spec=typing.ContextManager,
                                                instance=True)
        mockedSessionCtx.__enter__.return_value = Session()
        mockedSessionMaker = mock.Mock(return_value=mockedSessionCtx)

        # 创建基于mock对象的用户crud对象
        self._crud = user.UserCrud(mockedSessionMaker)