Python的create_autospec函数中的instance参数是用来干什么的?

4

我正在使用Python进行模拟自动测试。这是一个基本的测试用例,其中我正在使用create_autospec来自动化测试Django的User类。

from unittest.mock import create_autospec
from django.contrib.auth.models import User

def test_mock_spec():
    user = create_autospec(User, spec_set=True, instance=True, username="batman")
    assert user.username == "batman"
    with pytest.raises(AttributeError):
        create_autospec(User, spec_set=True, x1=1)
    with pytest.raises(AttributeError):
        assert user.x2

当我将instance=Trueinstance=False都设置时,测试通过了,那么这个参数到底是做什么的?它的目的是什么?我看到多篇博客把它设为True这里这里),所以我觉得它很重要。
文档如下所述,但对我来说没有意义:

如果一个类被用作规范,则模拟返回值(类的实例)将具有相同的规范。 通过传递instance=True,可以将类用作实例对象的规范。 仅当模拟的实例可调用时,才能调用返回的模拟对象。

1个回答

6
考虑模拟 int 类。与大多数类一样,int 是可调用的,因此 int 类的模拟也应该是可调用的。
另一方面,考虑模拟一个 int 实例。整数是不可调用的,因此整数的模拟也不应该是可调用的。 instance 参数让您控制获取这些行为中的哪一个。 create_autospec(int, instance=False) 返回一个可调用的模拟,而 create_autospec(int, instance=True) 返回一个不可调用的模拟。如果您这样做
m1 = create_autospec(int, instance=False)
m2 = create_autospec(int, instance=True)

m1()
m2()

只有m2()这一行代码会引发异常。


另一个方面是,create_autospec 的第一个参数 spec(我认为它是“specimen”的缩写)可以是一个实例,也可以是一个类。例如,在数据类中定义的属性无法从类中推断出时,这非常方便。在这种情况下,根据我阅读的源代码,instance 参数的值将被忽略,就像它被设置为 True 一样。指定实例可能更麻烦,尽管对于我来说,为其所有参数提供 None 通常很好用,但对于使用实例属性作为接口的情况来说,这是很有用的。 - scanny

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