Как утверждать, что макет был вызван с определенным типом, а не экземпляром?


Я использую последнюю версию 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 не совпадает с тем, который я ожидаю в самом утверждении.

Если бы я только заботился о тип, а не фактический экземпляр как я могу переписать утверждение?

1 2

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