python - 如何断言模拟是用特定类型而不是实例调用的?

标签 python unit-testing python-2.7 python-mock

我正在使用最新版本的 mock 和 python 2.7.3

我正在构建我的第一个 flask 应用程序,我正在测试一些基本的中间件以查看 flask.abort() 是否发生(当它发生时,我断言调用了一个方法,但出现了未经授权的异常)

    def test_invokes_raise_http_exception_when_apply_blows_up(self):
        start_response = mock.Mock()
        self.sut = BrokenMiddleware(self.app)
        with mock.patch.object(self.sut, 'raise_http_exception') as raise_up:
            self.sut.__call__({}, start_response)
        raise_up.assert_called_once_with(Unauthorized(), start_response)

class BrokenMiddleware(Middleware):

    def apply_middleware(self, environ):
        flask.abort(401) 

这是我的生产代码

class Middleware(object):
    def __call__(self, environ, start_response):                                                                               
        try:
            self.apply_middleware(environ)
        except Exception as e:
            return self.raise_http_exception(e, start_response)

    def raise_http_exception(self, exception, start_response):
        pass

我遇到的问题是 mock 使断言失败,因为引发的 401 与我在断言本身中预期的不同。

如果我只关心类型,而不关心实际实例,我该如何重写断言?

最佳答案

你可能不会喜欢它,但这就是我过去做同样事情的方式:

self.assertIsInstance(raise_up.mock_calls[0][1][0], Unauthorized)

这里有一些解释

>>> print raise_up.mock_calls
[call(Unauthorized())]
>>> print raise_up.mock_calls[0]
call(Unauthorized())
>>> print raise_up.mock_calls[0][1]
(Unauthorized(),)
>>> print type(raise_up.mock_calls[0][1][0])
<type 'Unauthorized'>

关于python - 如何断言模拟是用特定类型而不是实例调用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12821090/

相关文章:

python - os.walk 认为我的目录只包含 .DS_Store 文件

python - SonarQube 没有正确导入 Python 项目的 coverage.xml 文件

Python:加载 CSV,第一列作为行名,第一行作为列名

python - App Engine 上的 Django 与 webapp2

python - 特定列中的简单 Numpy 最小值和最大值

python - 将 iso 格式转换为日期时间

python - 简单的正则表达式问题 : Removing all new lines from a file

cordova - cordova自定义插件的测试覆盖率工具

database - Symfony 3为单元测试创​​建数据库

python - Python 字符串中出现意外的空字符串