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, [])
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
siehe mein Update. Ich habe den 'Service' in einem Modul definiert. – pangpang
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