Django - Factoryboy:__str__ 调用字符串格式 returns 对象
Django - Factoryboy: __str__ call with stringformating returns object instead
我正在为 Django 应用程序创建大量测试,同时使用 factory-boy
生成模型实例。但是,我的测试失败了,但我不完全确定为什么会这样。
def test__str__(self) -> None:
self.assertEqual(
str(self.academy_settings),
"Academy settings for {}".format(self.academy_settings.academy),
)
如您所见,我正在我们的一个 Django 模型上验证 __str__
方法,但是当我 运行 这个测试时,我得到以下错误。
Failure
Expected :"<AcademySettingsFactory for <class 'core.models.AcademySettings'>>"
Actual :'Academy settings for <factory.declarations.SubFactory object at 0x1105ce438>'
这些错误让我有些费解。很明显,实际结果与我期望的结果完全不同,但可以为预期结果设置相同的结果。
正如您在下面的模型定义中看到的那样,它们都应该 return 简单的字符串对象。
class Academy(models.Model):
name = models.CharField(
max_length=400, unique=True
)
def __str__(self) -> str:
return "{}".format(self.name)
class AcademySettings(models.Model):
academy = models.ForeignKey(Academy, on_delete=models.CASCADE)
(...)
def __str__(self) -> str:
return "Academy settings for {}".format(self.academy)
现在,正如您在下面的工厂中看到的那样,我编写了一些自定义 lazy_attribute
来保持 name
字段的唯一性,但即使没有该代码,错误也会不断出现。所以我不确定这里的实际原因是什么 - 有人知道我做错了什么吗?
class AcademyFactory(factory.DjangoModelFactory):
class Meta:
model = 'core.Academy'
@factory.lazy_attribute
def name(self):
"""
The faker module has an habit of generating too many duplicate names
every now and then. We solve this by appending the name with the
instance.id
"""
return '{} {}'.format(
factory.Faker('company').generate(),
str(factory.Sequence(lambda n: ' {}'.format(n))._creation_counter),
)
class AcademySettingsFactory(factory.DjangoModelFactory):
class Meta:
model = 'core.AcademySettings'
academy = factory.SubFactory(AcademyFactory)
很可能,您正在定义 self.academy_settings = AcademySettingsFactory
,因此引用 class 而不是获取实例。
这可以通过以下方式解决:
def test__str__(self):
academy_settings = AcademySettingsFactory()
self.assertEqual(
"Academy settings for {}".format(academy_settings.academy),
str(academy_settings),
)
(快速说明:调用是 self.assertEqual(expected, computed)
:将期望值放在第一位,最后计算一个)。
我正在为 Django 应用程序创建大量测试,同时使用 factory-boy
生成模型实例。但是,我的测试失败了,但我不完全确定为什么会这样。
def test__str__(self) -> None:
self.assertEqual(
str(self.academy_settings),
"Academy settings for {}".format(self.academy_settings.academy),
)
如您所见,我正在我们的一个 Django 模型上验证 __str__
方法,但是当我 运行 这个测试时,我得到以下错误。
Failure
Expected :"<AcademySettingsFactory for <class 'core.models.AcademySettings'>>"
Actual :'Academy settings for <factory.declarations.SubFactory object at 0x1105ce438>'
这些错误让我有些费解。很明显,实际结果与我期望的结果完全不同,但可以为预期结果设置相同的结果。
正如您在下面的模型定义中看到的那样,它们都应该 return 简单的字符串对象。
class Academy(models.Model):
name = models.CharField(
max_length=400, unique=True
)
def __str__(self) -> str:
return "{}".format(self.name)
class AcademySettings(models.Model):
academy = models.ForeignKey(Academy, on_delete=models.CASCADE)
(...)
def __str__(self) -> str:
return "Academy settings for {}".format(self.academy)
现在,正如您在下面的工厂中看到的那样,我编写了一些自定义 lazy_attribute
来保持 name
字段的唯一性,但即使没有该代码,错误也会不断出现。所以我不确定这里的实际原因是什么 - 有人知道我做错了什么吗?
class AcademyFactory(factory.DjangoModelFactory):
class Meta:
model = 'core.Academy'
@factory.lazy_attribute
def name(self):
"""
The faker module has an habit of generating too many duplicate names
every now and then. We solve this by appending the name with the
instance.id
"""
return '{} {}'.format(
factory.Faker('company').generate(),
str(factory.Sequence(lambda n: ' {}'.format(n))._creation_counter),
)
class AcademySettingsFactory(factory.DjangoModelFactory):
class Meta:
model = 'core.AcademySettings'
academy = factory.SubFactory(AcademyFactory)
很可能,您正在定义 self.academy_settings = AcademySettingsFactory
,因此引用 class 而不是获取实例。
这可以通过以下方式解决:
def test__str__(self):
academy_settings = AcademySettingsFactory()
self.assertEqual(
"Academy settings for {}".format(academy_settings.academy),
str(academy_settings),
)
(快速说明:调用是 self.assertEqual(expected, computed)
:将期望值放在第一位,最后计算一个)。