如何模拟从Python中的另一个类导入的类方法的返回值?

时间:2016-07-05 23:45:06

标签: python mocking pytest monkeypatching

我有这些文件:

/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()方法的返回值,而不是这样做?

1 个答案:

答案 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。