我有这些文件:
/foo.py
/foo2.py
/test_food.py
在foo.py中,我有这个:
from foo2 import Foo2
class Foo(object):
def GetFoo2(self):
f = Foo2()
return f.Get()
在foo2.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中,我能够模拟或monkeypatch方法GetFoo2()。但是,如何在不更改foo.py和foo2.py中的代码的情况下,从test_foo.py模拟Foo2的Get()方法的返回值,而不是这样做?
答案 0 :(得分: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。