“意外”;“记录已存在”;在Django ModelForm测试用例中
我有灵活的数据模型,表示网络交换机及其各个端口,如下所示(对于第一个端口的名称表示歉意;不幸的是,我想不出更好的名称): 验证数据输入以确保“意外”;“记录已存在”;在Django ModelForm测试用例中,django,unit-testing,Django,Unit Testing,我有灵活的数据模型,表示网络交换机及其各个端口,如下所示(对于第一个端口的名称表示歉意;不幸的是,我想不出更好的名称): 验证数据输入以确保端口号在1到型号.端口计数的范围内。对于作者来说,这是一个微不足道的测试用例。另一个重要的验证是myModelAdminForm.clean(),以确保减少Model.port\u计数不会使任何现有的port记录违反新范围。(这些端口可能需要先删除。)编写这个clean()方法也很简单,但是为这个验证编写一个测试用例让我在没有地图或指南的情况下进入了一个新的
端口号
在1到型号.端口计数
的范围内。对于作者来说,这是一个微不足道的测试用例。另一个重要的验证是myModelAdminForm.clean()
,以确保减少Model.port\u计数不会使任何现有的port
记录违反新范围。(这些端口可能需要先删除。)编写这个clean()
方法也很简单,但是为这个验证编写一个测试用例让我在没有地图或指南的情况下进入了一个新的领域
因为这样的测试需要一点初始DB填充,所以我创建了一个助手:
def add_one(cls, **kwargs):
_log.info(f'adding one {cls.__name__}')
return cls.objects.create(**kwargs)
我开始开发测试用例,以模拟不会有任何问题的Model.port\u count
编辑,以证明我的事务部分是正确的。稍后,我将扩展代码,这样就有了一个问题,我可以确保TestCase重现了一个潜在的问题,这是可以防止的(通过我已经编写的代码)
令我大吃一惊的是,assertTrue
失败了,form.errors
解释了具有此名称的模型已经存在。
因此,form.is\u valid()
似乎在假设我将添加而不是更改。我怎么能嘲笑这种情况
def add_one(cls, **kwargs):
_log.info(f'adding one {cls.__name__}')
return cls.objects.create(**kwargs)
class TestModelAdminForm__does_not_allow_invalidation_of_ports(TestCase):
# I've inlined things better in setUp() for simplicity here.
# Also, the all-caps names are simple dicts defined elsewhere.
def test_invalid__bad_max_port_number(self):
catalyst1 = add_one(Model, **CATALYST1)
switch1 = add_one(Switch, model=catalyst1, **SWITCH1)
s1p1 = add_one(Port, switch=switch1, **PORT1)
s1p24 = add_one(Port, switch=switch1, **PORT24)
# Create a form to simulate a disallowed edit.
data = CATALYST1.copy()
form = ModelAdminForm(data)
# Original data was correct and no edit has yet occurred so this should pass.
self.assertTrue(form.is_valid(), f'unexpected: {form.errors}')
# Here I had planned to do something like:
data['port_count'] = 12 # as would make s1p24 invalid.
# So that the attempted edit would be disallowed...
self.assertFalse(form.is_valid(), f'unexpected: {form.errors}')