2016-07-05 21 views
1

Ich habe diese Dateien:Wie kann man den Rückgabewert einer Klassenmethode, die aus einer anderen Klasse in Python importiert wurde, vortäuschen?

/foo.py 
/foo2.py 
/test_food.py 

in foo.py, ich habe dies:

from foo2 import Foo2 

class Foo(object): 

    def GetFoo2(self): 
     f = Foo2() 
     return f.Get() 

und in foo2.py, ich habe:

class Foo2(object): 

    def __init__(self): 
     self.myvar = "eeee" 

    def Get(self): 
     return self.myvar 

In test_foo.py ,

import os, sys, json, pytest 
from mock import * 
from foo import Foo 

def test_foo_ok(monkeypatch): 

    monkeypatch.setattr(Foo, "GetFoo2", lambda x:"abc") 
    f = Foo() 
    result = f.GetFoo2() 
    assert result == "abc" 

Also, in test_foo.py, bin ich in der Lage, die Methode GetFoo2() zu verspotten oder zu monkeyern. Wie kann man jedoch den Rückgabewert der Foo2-Methode Get() aus test_foo.py verspotten, ohne den Code in foo.py und foo2.py zu ändern?

Antwort

0

Wenn Sie mit from importieren, können Sie den Namespace dieses Moduls patchen. Hier ist ein Beispiel für Ihre test_foo_ok Funktion:

import os, sys, json, pytest 
from mock import * 
from foo import Foo 

def test_foo_ok(monkeypatch): 
    monkeypatch.setattr("foo.Foo2.Get", lambda x:"abc") 
    f = Foo() 
    result = f.GetFoo2() 
    assert result == "abc" 

Siehe where to patch Abschnitt der Dokumentation der Mock-Bibliothek für weitere Details. Die gleichen Regeln gelten für Pytests Monkeypatch.

+0

Ich habe das versucht, und ich habe diesen Fehler bei monkeypatch.setattr (...): Import: Kein Modul foo – murvinlai

+0

@murvinlai, welche Version von pytest benannt? Ich habe das mit 2.9.1 getestet, indem ich Ihre anderen Dateien benützte, wie Sie sie beschrieben haben. – jordanm