gpt4 book ai didi

python - factoryboy 没有覆盖 django 模型属性

转载 作者:太空宇宙 更新时间:2023-11-03 11:46:53 37 4
gpt4 key购买 nike

出于测试目的,我正在尝试通过 factory_boy 覆盖自定义 Django 模型属性。但它似乎只是采用了模型的默认行为。工厂男孩不能更改自定义属性的默认行为吗?

这是我写的一个基本测试:

模型.py:

class Session(models.Model):
name = models.CharField(max_length=100)

@property
def foo(self):
return method_not_callable_in_testing()

def method_not_callable_in_testing():
return 42

session 工厂.py:

class SessionFactory(factory.django.DjangoModelFactory):
class Meta:
model = Session

name = "session"
foo = 1337

测试.py:类测试 session (测试用例):

def test_custom_attribute_overwritten_by_factoryboy(self):
session = SessionFactory.create()
self.assertEquals(session.foo, 1337)

运行测试时出现以下错误:

F
======================================================================
FAIL: test_custom_attribute_overwritten_by_factoryboy (bar.tests.TestSession)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/sh4ke/repos/foo/bar/tests.py", line 10, in test_custom_attribute_overwritten_by_factoryboy
self.assertEquals(session.foo, 1337)
AssertionError: 42 != 1337

最佳答案

tl;dr

factory_boy 可以更改“自定义属性”(我假设您指的是那些不是 django Fields),但它不能更改只读属性,这就是你想要做的。

更多信息

您的问题是您正在尝试使用工厂为只读属性设置属性。粗略地说,factory_boy 和 django 的组合意味着对 SessionFactory() 的调用正在做:

session = Session()
session.foo = 1337

但我不希望这会起作用,因为除非你声明 @foo.setter 方法 @property 假设你想要一个只读属性,因此引发尝试设置时出现属性错误。

奇怪的是为什么你没有看到那个错误,结果是 django 悄悄地抑制了它!它通过执行 getattr(session, 'foo') 看到您的模型具有 foo 属性,但它包裹了整个东西 ,包括 setattr try: except AttributeError: 中,所以当它检测并尝试设置一个根本不存在的属性时,它也会捕获并悄悄地忽略尝试设置只读属性的失败案例。

我怀疑这是一个错误...所以可能会尝试在 django 社区提出它。

关于python - factoryboy 没有覆盖 django 模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37340933/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com