Django-Factoryboy:带有字符串格式的__str__调用改为返回对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django-Factoryboy:带有字符串格式的__str__调用改为返回对象相关的知识,希望对你有一定的参考价值。

我正在使用factory-boy生成模型实例的同时为Django应用创建大量测试。但是,我的测试失败了,但是我不确定为什么会这样。

    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>'

这些错误令我有些困惑。很明显,实际结果与我期望的结果完全不同,但是可以为期望的结果设置相同的结果。

您可以在下面的模型定义中看到,它们两个都应返回简单的字符串对象。

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-Factoryboy:带有字符串格式的__str__调用改为返回对象的主要内容,如果未能解决你的问题,请参考以下文章

带有带有整数键的dict的python字符串格式()[重复]

C# 将浮点格式格式化为带有分隔符和填充 0 的字符串

如何创建一个直接接受带有格式的字符串作为参数的方法?

带有无符号字符的文本格式

使用带有 printf 的格式字符串打印可变字节数

Python:带有自定义分隔符的格式字符串[重复]