2016-07-05 5 views
1

나는 이러한 파일이 있습니다 파이썬에서 다른 클래스에서 가져온 클래스 메소드의 반환 값을 조롱하는 방법은 무엇입니까?

from foo2 import Foo2 

class Foo(object): 

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

및 foo2.py에서

, 내가 가진 : foo.py에서

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

을,이이

class Foo2(object): 

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

    def Get(self): 
     return self.myvar 

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" 

그래서, test_foo.py에서 GetFoo2() 메소드를 조롱하거나 monkeypatch 할 수 있습니다. 그러나 그 대신에 foo.py와 foo2.py에서 코드를 변경하지 않고 test_foo.py에서 Foo2의 Get() 메소드의 반환 값을 조롱 할 수 있습니까?

답변

0

from을 사용하여 가져올 때마다 해당 모듈의 네임 스페이스를 패치 할 수 있습니다. 여기 test_foo_ok 기능에 대한 예입니다

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" 

은 자세한 내용은 모의 라이브러리의 문서의 where to patch 섹션을 참조하십시오. pytest의 monkeypatch에도 같은 규칙이 적용됩니다.

+0

나는 그것을 시험해 보았고 monkeypatch.setattr (...)에서이 오류가 발생했습니다. ImportError : foo라는 모듈이 없습니다 – murvinlai

+0

@murvinlai pytest의 버전은 무엇입니까? 필자는 2.9.1로 설명한 다른 파일들을 설명했다. – jordanm

관련 문제