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

时间:2017-06-29 12:15:01

标签: python mocking

我想模仿

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()

它不起作用。 print语句应该是true,而不是。如果您需要更多信息,请发表评论。

2 个答案:

答案 0 :(得分:0)

这似乎有效

indexOf

答案 1 :(得分:0)

您可以在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对象实例)-在def test的范围内,包括对original_func的嵌套函数调用。

您用os.stat()对象替换的os_stat.return_value对象具有包括st_size在内的属性,并且您是要在模拟中设置其值的属性。

以完成工作的方式进行分配,但是请注意,默认情况下,在现有模拟上调用return_value属性已经返回了Mock()(除非您将其设置为某个值),因此将其设置为{ {1}}是不必要的。