我正在使用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=True
和instance=False
都设置时,测试通过了,那么这个参数到底是做什么的?它的目的是什么?我看到多篇博客把它设为True
(这里和这里),所以我觉得它很重要。文档如下所述,但对我来说没有意义:
如果一个类被用作规范,则模拟返回值(类的实例)将具有相同的规范。 通过传递instance=True,可以将类用作实例对象的规范。 仅当模拟的实例可调用时,才能调用返回的模拟对象。
create_autospec
的第一个参数spec
(我认为它是“specimen”的缩写)可以是一个实例,也可以是一个类。例如,在数据类中定义的属性无法从类中推断出时,这非常方便。在这种情况下,根据我阅读的源代码,instance
参数的值将被忽略,就像它被设置为True
一样。指定实例可能更麻烦,尽管对于我来说,为其所有参数提供None
通常很好用,但对于使用实例属性作为接口的情况来说,这是很有用的。 - scanny