2016-04-05 16 views
2

Я хочу протестировать метод http post, этот метод вызовет некоторую услугу, но служба не сможет работать на локальной тестовой машине, поэтому я хочу издеваться над ней.python как издеваться над методом?

test.py:

@route(bp, '/count', methods=['POST']) 
def count(): 
    from module import service 
    ... 
    total, ids = service(id, page, count) // total is a integer, ids is a list. 
    ... 
    return {'total': total, 'ids': ids} 

тест:

@mock.patch("module.service") 
def test_search_user(self, mock_service): 
    mock_service.return_value=(1, []) 

    url = url_for('users.count') 
    params = { .... } 

    response = self._test_app.post_json(
     url, params, headers=self.request_headers, expect_errors=True) 

    self.assertEqual(response.status_code, 200) 

но тест всегда терпела неудачу, он попытался вызвать service метод, но он не может работать на моей машине , Я просто хочу издеваться над этим, но не работает.

Любой может мне помочь! Заранее спасибо!

Согласно @syntonym ответ, мой тест должен писал так:

@mock.patch("test.service") 
def test_search_user(self, mock_service): 
    mock_service.return_value=(1, []) 
+0

Значит, 'обслуживание' в вашем первом фрагменте должно быть заменено магическим моментом? Откуда берется «сервис»? [Прочитайте это о том, где исправлять] (https://docs.python.org/3/library/unittest.mock.html#where-to-patch) – syntonym

+0

Посмотрите мое обновление. Я определил 'service' в модуле. – pangpang

+1

исправления работают по именам, а не по фактическим классам. Поэтому, если вы хотите, чтобы 'service' в' testmodule' ссылался на макет, вам нужно исправить '@ mock.patch (" testmodule.service ")', а не 'module.service'. Для получения дополнительной информации прочтите [this] (https://docs.python.org/3/library/unittest.mock.html#where-to-patch). – syntonym

ответ

2

@mock.patch фактически берет имя подстановок - не место, где находится объект, который вы хотите пропатчить acutally проживает. The documentation reads:

patch() работает (временно), изменяя объект, с которым указывает одно имя с другим. [...] Основной принцип заключается в том, что вы исправляете поиск объекта, , который не обязательно совпадает с местом, где он определен.

Смежные вопросы