如何模拟一个类的方法返回值

18

我想嘲笑

os.stat(self.tmp_file).st_size

def original_func():
     print (os.stat("test.txt").st_size==35)

我试过这个

@mock.patch("os.stat")
def test(os_stat):
    stat = mock.Mock()
    stat.st_size.return_value = 35
    os_stat.return_value = stat
    original_func()

它不起作用。打印语句应该为真,但实际上不是。


1
请详细说明“不起作用”的情况。请提供表明它不起作用的输出。它是否没有模拟而仍在执行“真实”方法?请解释。 - idjaw
@idjaw,我已经添加了使用它的函数。请检查是否需要任何其他信息。 - Akamad007
2个回答

24

您可以在 Mocks 上设置任意属性。

import os
import mock


def original_func():
    print(os.stat("test.txt").st_size == 35)


@mock.patch("os.stat")
def test(os_stat):
    os_stat.return_value.st_size = 35
    original_func()

test()

如果您想在Mock上设置任意属性,只需编造一个名称并将其设置为某个值。如果您想要一个任意方法,请编造一个名称,并将其.return_value的值设置为某个值:

import mock

mocky = mock.Mock()

# create an attribute `foo_attribute` and set it to a string value
mocky.foo_attribute = "hi"
print(mocky.foo_attribute)

# create a method `foo_method()` and set it to return an integer value
mocky.foo_method.return_value = 100
print(mocky.foo_method())

细节

@mock.patch("os.stat") 装饰器用于模拟 os.stat(), 也就是 stat 类的构造方法。

os_stat.return_value 默认情况下会返回一个新的 Mock 对象实例,该实例将替换构造方法的返回值(即 stat 对象实例) - 在包含嵌套函数调用 original_funcdef test 范围内。

你要用 os_stat.return_value 对象替换掉原来的 os.stat() 对象,并且这个被替换的对象有一些属性,其中包括 st_size。你需要设置 mock 对象的这个属性。

虽然你现在的赋值方式可以工作,但请注意,在现有的模拟对象上调用 return_value 属性默认情况下已经返回一个 Mock() 对象,所以将其设置为 Mock(st_size=35) 是不必要的。


1

这似乎可以工作

import os
import mock


def original_func():
    print (os.stat("test.txt").st_size == 35)


@mock.patch("os.stat")
def test(os_stat):
    os_stat.return_value = mock.Mock(st_size=35)
    original_func()

test()

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