如何使用特定类型而不是实例来调用mock来调用?

时间:2012-10-10 13:56:50

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

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

我正在构建我的第一个烧瓶应用程序,我正在测试一些基本的中间件,看看是否发生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引发的与我在断言本身期望的那个不一样。

如果我只关心类型,而不是实际的实例,我怎么能重写断言?

1 个答案:

答案 0 :(得分:1)

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

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'>