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

4
我有以下文件:
/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中,我能够mock或者monkeypatch方法GetFoo2()。然而,除此之外,如何在不改变foo.py和foo2.py代码的情况下,从test_foo.py中mock Foo2的Get()方法的返回值呢?

1个回答

3
每当你使用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"

请参考Mock库文档中的补丁位置部分了解更多细节信息。pytest的monkeypatch遵循相同的规则。

我已经尝试过了,但在monkeypatch.setattr(...)处出现了以下错误:ImportError: No module named foo - murvinlai
@murvinlai pytest 的版本是多少?我使用了你描述的其他文件测试了 2.9.1 版本。 - jordanm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接