2016-07-12 15 views
0

Ich habe eine tastypie REST API-Ressource, sagen wir Resource, die importiert und verwendet eine Funktion get_token von libs.utils in seiner obj_get-Methode.Mock-Patch ersetzt Funktion nicht korrekt

So, diesen Bereich zu testen, die ich in meinem Test-Klasse haben einen Test wie geschaffen, was folgt:

mock_get_token = Mock(return_value="something") 

@patch("path.to.resource.get_token", mock_get_token) 
def test_get_token(self): 
    params = {"args": "args"} 
    # following call should call the get_token function in the resource 
    response = self.client.get("path/to/resource", params) 
    # do things with the response and make sure I get right output 

Also, wenn ich den Test von selbst laufen, die @patch ordnungsgemäß funktioniert und wie erwartet, ersetzt die Funktion mit der Scheinfunktion. Das Ausführen des Tests innerhalb unserer größeren Testsuite für die Anwendung führt jedoch dazu, dass der Patch fehlschlägt.

Wenn Sie beispielsweise manuell versuchen, die Funktion durch die Mocked-Funktion zu ersetzen, wird ein Patch nicht erfolgreich ausgeführt. Ich frage mich, was das Problem sonst noch verursachen könnte, und ich finde es sehr merkwürdig, dass der Patch korrekt funktioniert, wenn der Test selbst oder mit einer kleineren Teilmenge unserer Testsuite ausgeführt wird.

Antwort

0

Wir konnten die genaue Lösung nicht herausfinden, aber eine Problemumgehung war, dass, da der Großteil der Logik in der obj_get-Methode von einer anderen Funktion api_call() behandelt wurde, Wir verspotteten stattdessen den Aufruf an die api_call Funktion.

Das Problem schien also ein Importproblem zu sein, da api_call nicht importiert wurde.

0

Werfen Sie einen Blick auf bekannte gotchas. Es könnte sein, dass Sie versuchen, falschen Platz zu patch ...