2016-04-05 7 views
2

Ich möchte eine HTTP-Post-Methode testen, diese Methode wird einige Dienste aufrufen, aber der Dienst kann nicht in lokalen Testmaschine arbeiten, also möchte ich es verspotten.python wie man eine Methode vortäuscht?

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} 

Testfall:

@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) 

aber Testfall immer gescheitert ist, versucht service Methode zu nennen, aber es kann auf meinem Rechner nicht funktionieren . Ich will es nur verspotten, aber es funktioniert nicht.

Jeder kann mir helfen! Danke im Voraus!

Nach @syntonym Antwort, mein Testfall soll wie folgt geschrieben werden:

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

Also 'Service' in Ihrem ersten Snippet sollte durch ein magickmock ersetzt werden? Woher kommt "Service"? [Lesen Sie hier, wo Sie Patches installieren können] (https://docs.python.org/3/library/unittest.mock.html#where-to-patch) – syntonym

+0

siehe mein Update. Ich habe den 'Service' in einem Modul definiert. – pangpang

+1

Patches funktionieren nach Namen, nicht nach tatsächlichen Klassen. Wenn Sie also wollen, dass sich 'service' in' testmodule' auf den Mock bezieht, müssen Sie '@ mock.patch (" testmodule.service ")', nicht 'module.service' patchen. Für weitere Informationen lesen Sie [this] (https://docs.python.org/3/library/unittest.mock.html#where-to-patch). – syntonym

Antwort

2

@mock.patch nimmt tatsächlich den Nachschlag-Namen - nicht der Ort, an dem das Objekt, das Sie acutally befindet patchen möge. The documentation reads:

patch() funktioniert, indem (vorübergehend) das Objekt geändert wird, auf das ein Name mit einem anderen verweist. [...] Das Grundprinzip ist, dass Sie Patch, wo ein Objekt nachgeschlagen wird, , die nicht unbedingt derselbe Ort ist, wo es definiert ist.

Verwandte Themen