如何模拟类的方法返回值

Aka*_*007 14 python mocking

我想嘲笑

os.stat(self.tmp_file).st_size

def original_func():
     print (os.stat("test.txt").st_size==35)
Run Code Online (Sandbox Code Playgroud)

我试过这个

@mock.patch("os.stat")
def test(os_stat):
    stat = mock.Mock()
    stat.st_size.return_value = 35
    os_stat.return_value = stat
    original_func()
Run Code Online (Sandbox Code Playgroud)

这是行不通的。打印语句应该是真的,但事实并非如此。如果您需要更多信息,请发表评论。

Dav*_*vos 12

您可以在 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()
Run Code Online (Sandbox Code Playgroud)

如果你想要一个 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())
Run Code Online (Sandbox Code Playgroud)

细节

@mock.patch("os.stat")装饰被嘲讽os.stat()的的构造方法stat的类。

os_stat.return_value默认情况下,返回一个新的Mock对象实例,它将替换构造函数方法的返回值(stat 对象实例) - 在 的范围内def test,其中包括对 的嵌套函数调用original_func

os.stat()您用os_stat.return_valueobject替换的那个对象具有属性,包括st_size,并且您要在模拟上设置该属性的值。

以您已经完成的方式分配它,但请注意,return_value在现有模拟上调用属性已经Mock()默认返回 a (除非您将其设置为某个值),因此Mock(st_size=35)无需将其设置为。