正在测试的模型是
class A(models.Model):
""" model A"""
name = models.CharField(max_length=50, unique=True)
slug = AutoSlugField(max_length=265, unique=True, populate_from='name')
link = models.URLField(blank=True)
class Meta:
verbose_name = 'Model A'
def __unicode__(self):
return self.name
class B(models.Model):
""" model B"""
name = models.CharField(max_length=50, unique=True)
slug = AutoSlugField(max_length=265, unique=True, populate_from='name')
link = models.URLField(blank=True)
class Meta:
verbose_name = 'Model B'
def __unicode__(self):
return self.name
给定模型的简单测试,
class TestA(TestCase):
""" Test the A model """
def setUp(self):
self.name = 'A'
self.slug = 'a'
self.object = A.objects.create(name=self.name)
def test_autoslug_generaton(self):
""" test automatically generated slug """
assert self.object.slug == self.slug
def test_return_correct_name(self):
""" test the __unicode__() method """
assert self.object.__unicode__() == self.name
class TestB(TestCase):
""" Test the A model """
def setUp(self):
self.name = 'B'
self.slug = 'b'
self.object = B.objects.create(name=self.name)
def test_autoslug_generaton(self):
""" test automatically generated slug """
assert self.object.slug == self.slug
def test_return_correct_name(self):
""" test the __unicode__() method """
assert self.object.__unicode__() == self.name
这里的测试违反了 DRY,因为测试只是模型更改后的重复。如何重构测试,因为它不违反 DRY?
DRY- Dont Repeat Yourself, a software development philosophy which aims at reducing redundancy and code repetition.
谢谢。
最佳答案
正如 @mevius 评论中指出的答案中提到的,多重继承是一种可行的方法。为重复的测试方法创建一个Mixin,并在实际的测试类中实现setUp
和tearDown
:
class MixinAB(object):
def test_autoslug_generaton(self):
""" test automatically generated slug """
assert self.object.code == self.slug
def test_return_correct_name(self):
""" test the __unicode__() method """
assert self.object.__unicode__() == self.name
class TestA(MixinAB, TestCase):
""" Test the A model """
def setUp(self):
self.name = 'A'
self.slug = 'a'
self.object = A.objects.create(name=self.name)
关于python - Django:优化违反 DRY 的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36516387/