2017-04-12 4 views
2

Ich versuche herauszufinden, warum ich nicht in der Lage, einen verspotteten Rückgabewert in einem Gerät zu verwenden scheinen. Mit den folgenden EinfuhrenPytest-Mock Spötter in Pytest Fixture

import pytest 
import uuid 

pytest-Mock-Beispiel, das funktioniert:

def test_mockers(mocker): 
    mock_uuid = mocker.patch.object(uuid, 'uuid4', autospec=True) 
    mock_uuid.return_value = uuid.UUID(hex='5ecd5827b6ef4067b5ac3ceac07dde9f') 
    # this would return a different value if this wasn't the case 
    assert uuid.uuid4().hex == '5ecd5827b6ef4067b5ac3ceac07dde9f' 

Der obige Test besteht. aber als ich dies in vielen Testfällen verwenden dachte ich, dass ich nur eine Halterung verwenden:

@pytest.fixture 
def mocked_uuid(mocker): 
    mock_uuid = mocker.patch.object(uuid, 'uuid4', autospec=True) 
    mock_uuid.return_value = uuid.UUID(hex='5ecd5827b6ef4067b5ac3ceac07dde9f') 
    return mock_uuid 

def test_mockers(mocked_uuid): 
    # this would return a different value if this wasn't the case 
    assert uuid.uuid4().hex == '5ecd5827b6ef4067b5ac3ceac07dde9f' 

mit der folgenden Ausgabe der oben versagt:

FAILED 
phidgetrest\tests\test_taskscheduler_scheduler.py:62 (test_mockers) 
mocked_uuid = <function uuid4 at 0x0000029738C5B2F0> 

    def test_mockers(mocked_uuid): 
     # this would return a different value if this wasn't the case 
>  assert uuid.uuid4().hex == '5ecd5827b6ef4067b5ac3ceac07dde9f' 
E  AssertionError: assert <MagicMock name='uuid4().hex' id='2848515660208'> == '5ecd5827b6ef4067b5ac3ceac07dde9f' 
E  + where <MagicMock name='uuid4().hex' id='2848515660208'> = <MagicMock name='uuid4()' id='2848515746896'>.hex 
E  + where <MagicMock name='uuid4()' id='2848515746896'> = <function uuid4 at 0x0000029738C5B2F0>() 
E  +  where <function uuid4 at 0x0000029738C5B2F0> = uuid.uuid4 

tests\test_taskscheduler_scheduler.py:65: AssertionError 

der Hoffnung, jemand kann mir helfen, warum zu verstehen das eine funktioniert und das andere nicht oder besser noch eine funktionierende Lösung!

Ich habe auch versucht, den Umfang der Leuchte [Sitzung, Modul, Funktion] zu ändern, nur für den Fall, dass ich nicht wirklich verstehe, warum es versagt.

+0

Ihr Beispiel funktioniert gut für mich, sowohl auf Python 2 und 3. –

+0

Könnten Sie bitte einige Einzelheiten Ihres Setups und wie Sie es ausgeführt haben ? vielleicht kann ich aufspüren, worum es in meiner Umgebung geht, die nicht funktioniert. Ich benutze Python 3.6 (prob sollte das erwähnt haben) Auf jeden Fall dachte ich, es sollte funktionieren und eine github Suche zeigte ähnliche Beispiele von patch.object mit Pytest-Mock in einer Halterung, aber nicht für mich. – ehindy

+0

Ich habe die Datei verwendet, die Sie oben gezeigt haben, mit einem zusätzlichen Importpytest, Uuid. Dann lief es mit Python 3.6 und Pytest 3.0.7. Wenn Sie Ihren StackTrace betrachten, führen Sie nicht den Code aus, den Sie oben gezeigt haben. –

Antwort

3

So gefunden, der Täter und es war wirklich albern, ich habe tatsächlich die oben genannten Beispiele eher dann kopieren und einfügen, so dass mein ursprünglicher Code ein Problem hat. In meiner Befestigung hatte ich getippt:

mock_uuid.return_value(uuid.UUID(hex='5ecd5827b6ef4067b5ac3ceac07dde9f')) 

Wenn es hätte sein sollen:

mock_uuid.return_value = uuid.UUID(hex='5ecd5827b6ef4067b5ac3ceac07dde9f') 

, die ich in meinem Beispiel hatte, daher funktionierte es andere für ... so viele Stunden verloren ... Gefühl eher albern, aber ich hoffe, dass dies jemand in der Zukunft helfen kann ...

Verwandte Themen