【发布时间】:2019-09-16 16:04:48
【问题描述】:
我正在为我的 interface 应用程序运行 django 测试覆盖率。下面的视图调用WelcomeMessage 模型,基本上说如果该查询集中没有消息,则默认为“欢迎...”,如果有超过 1 个“活动”,它将显示最近的一个。基本上,当有超过 1 条活动消息时,我如何测试 else 行?
我已经尝试创建两个不同的WelcomeMessage 实例,其中一个是最近的,但是当我运行覆盖时,它仍然将else 段突出显示为红色。
运行覆盖:
coverage run --source='.' manage.py test interface
查看:
def index(request):
msg = WelcomeMessage.objects.filter(active=True).order_by('-modified_at')
if len(msg) == 0:
msg = "Welcome message"
else:
msg = msg[0] # -- Need test coverage here --
context = {'msg': msg}
return render(request, 'interface/index.html', context)
单元测试:
def test_indexWelcomeMessage(self):
welcome1 = WelcomeMessage.objects.create(
created_at=datetime(2019, 1, 1),
modified_at=datetime(2019, 1, 1),
active=True,
msg="Welcome message"
)
welcome2 = WelcomeMessage.objects.create(
created_at=datetime.now(),
modified_at=datetime.now(),
active=True,
msg="Recent welcome message"
)
messages = WelcomeMessage.objects.filter(
active=True).order_by('-modified_at')
if len(messages) == 0:
msg = "testing this message"
else:
msg = messages[0]
recentMsgVal = getattr(welcome2, 'msg')
msg = messages[0]
expectedMsgVal = messages.values_list('msg', flat=True).first()
self.assertNotEqual(len(messages), 0)
self.assertEqual(recentMsgVal, expectedMsgVal) # These asserts pass, but no coverage.
WelcomeMessage 模型:
class WelcomeMessage(models.Model):
created_at = models.DateTimeField(
auto_now_add=True, verbose_name='Created')
modified_at = models.DateTimeField(
auto_now=True, verbose_name="Last change")
active = models.BooleanField(default=True)
msg = models.TextField(null=True, verbose_name='Message')
如何编写测试以覆盖else 语句?
【问题讨论】:
标签: python django unit-testing code-coverage