2017-03-29 2 views
1

Angenommen, ich habe ein VerzeichnisUnit Testing die Datenbanken

home/user/my_python_scripts/ 
        /src 
         /my_script.py 
        /tests 
         /test_my_script.py 

ich einige Unit-Tests leite my_script.py vom ~/my_python_scripts/test Verzeichnis zu testen. Ich importiere die Funktion von my_script in meine test_my_script.py.

Das Problem tritt jedoch auf, da die Funktion in my_script.py zwei andere Funktionen aus einem anderen Skript importiert. Diese beiden Funktionen fragen eine Datenbank nach bestimmten Daten ab. Ich spotte und patche diese beiden Funktionen in meinem Testskript, aber wenn ich pytest auf diesem Skript ausführen, endet die Funktion unabhängig von der Abfrage der Datenbank. Ich habe mir die beiden Funktionen angesehen, die my_script.py verwendet. Jeder von ihnen fragt eine andere Datenbank ab und eine der Funktionen endet mit drei anderen Funktionen, die in der gleichen Datei leben.

Sind diese Funktionen und/oder Datenbanken in meinem Komponententest nicht korrekt? Ich kann den Code nicht teilen, da es proprietär ist, aber ich bin mehr als glücklich, mein Unit-Test-Code unten zu teilen:

from pytest_mock import mocker 

params = [(3141, 55)] 
raw_data = [{'a': 'fizz', 'b': 'buzz', 'c': 'foo', 'd': 'hello'}] 
descriptors = ['taxi', 3141, 55, 1] 

def test_get_data(mocker): 
    setattr(get_data, 'get_raw_data', params) 
    mocker.patch.object(get_data, 'get_raw_data') 
    get_data.get_raw_data.return_value = params 
    setattr(get_data, 'get_data_by_day', raw_data) 
    mocker.patch.object(get_data, 'get_data_by_day') 
    get_data.get_data_by_day.return_value = raw_data 
    assert get_data('taxi', 3141, '1', '3') == raw_data, descriptors 

Suchen Sie für jede Beratung sowie Tipps.

+0

Das klingt eher nach einem Designproblem. ** Importieren ** sollte keine echten Aktionen auslösen. – GhostCat

+0

so sagen Sie, dass die Art, wie die zwei anderen Funktionen entworfen wurden, fehlerhaft sind. Unabhängig davon haben Sie, abgesehen von dem Umschreiben des gesamten anderen Codes, einen Hinweis, wie Sie in diesem Szenario vorgehen sollten. –

+1

Ich bin nicht so sehr in Python; also, nein. Aber wieder; Wollen Sie wirklich, dass eine Import-Anweisung solche Aktivitäten auslöst? Was ist, wenn jemand in seinem Drehbuch einen solchen Import zufällig hat? Kopieren und Einfügen geschieht die ganze Zeit. In meinen Augen besteht die einzig vernünftige und langfristige Antwort darin, das wirkliche Problem zu lösen. stattdessen um es herum arbeiten; sogar in Ihrem Test-Setup. – GhostCat

Antwort

1

Also habe ich es herausgefunden. Ich habe die Werte der gepatchten Mock-Funktionen nicht richtig gesetzt. Dies ist der Code, der am Ende funktioniert hat.

from mock import patch 
from .relative.path import get_data 

params = [(3141, 55)] 
raw_data = [{'a': 'fizz', 'b': 'buzz', 'c': 'foo', 'd': 'hello'}] 
descriptors = ['taxi', 3141, 55, 1] 

@patch.object(get_data, 'get_raw_data') 
@patch.object(get_data, 'get_data_by_day') 
def test_get_stuff_1(mock_get_data_by_day, mock_get_raw_data): 
    mock_get_data_by_day.return_value = raw_data 
    mock_get_raw_data.return_value = params 
    result = get_data.get_stuff('taxi', 3141, '1', '3') 
    assert result == (raw_data, descriptors) 

importiere ich das Skript get_data.py als Objekt, und dann jede Funktion get_raw_data und get_data_by_day als Attribut des Objekts Patch. Wenn ich dann den Komponententest mit den von mir bereitgestellten Scheinwerten durchführe, gebe ich die erwarteten Ergebnisse zurück.