首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django - Factoryboy:用字符串形式返回对象的__str__调用

Django - Factoryboy:用字符串形式返回对象的__str__调用
EN

Stack Overflow用户
提问于 2019-11-15 17:15:35
回答 1查看 141关注 0票数 0

我正在为Django应用程序创建许多测试,同时使用factory-boy生成模型实例。然而,我的测试失败了,但我不完全确定为什么会这样。

代码语言:javascript
复制
    def test__str__(self) -> None:
        self.assertEqual(
            str(self.academy_settings),
            "Academy settings for {}".format(self.academy_settings.academy),
        )

如您所见,我正在我们的django模型上验证一个__str__方法,但是当我运行这个测试时,会得到以下错误。

代码语言:javascript
复制
Failure
Expected :"<AcademySettingsFactory for <class 'core.models.AcademySettings'>>"
Actual   :'Academy settings for <factory.declarations.SubFactory object at 0x1105ce438>'

这些错误让我有些困惑。很明显,实际结果与我预期的结果完全不同,但对于预期的结果也可以设置相同的结果。

正如您在下面的模型定义中所看到的,这两个定义都应该返回简单的字符串对象。

代码语言:javascript
复制
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字段的唯一性,但是即使没有这些代码,错误仍然会被引发。所以我不知道到底是什么原因--有人知道我做错了什么吗?

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-15 19:58:13

很可能,您正在定义self.academy_settings = AcademySettingsFactory,因此引用类而不是获取实例。

这可以通过以下方法加以解决:

代码语言:javascript
复制
def test__str__(self):
    academy_settings = AcademySettingsFactory()
    self.assertEqual(
        "Academy settings for {}".format(academy_settings.academy),
        str(academy_settings),
    )

(只需简单说明:调用是self.assertEqual(expected, computed)__:将期望值放在第一位,计算值放在最后)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58881786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档