python - 视图中的 Django 单元测试“else”语句以实现覆盖
问题描述
我正在为我的interface
应用程序运行 django 测试覆盖率。下面的视图调用了一个WelcomeMessage
模型,基本上说如果该查询集中没有消息,它默认为“Welcome..”,如果有超过 1 个“活动”,它将显示最近的一个。else
基本上,当有超过 1 条活动消息时,我如何测试线路?
我尝试创建两个不同的实例,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.
欢迎留言型号:
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
语句?
解决方案
据我所见,您没有index()
在此测试用例上直接或间接调用方法。为了向自己证明这一点,请添加一个调试器(ipdb
, pycharm debugger
- 无关紧要)或在 else 语句上引发一些错误并再次运行测试。它应该像以前一样运行。
如果你想写测试用例看看这个例子这个例子如何为 django 视图编写单元测试? 在您的情况下,它应该看起来像这样:
def test_index_welcome_message(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')
# this needed in case route needs auth
self.client.login(username='user', password='test')
response = self.client.get('/url/to/index/view')
assert response == expected_response
psself.client
是实例,django.test.Client
但请检查您的项目BaseTestCase
,您可能已经定义了一个。
推荐阅读
- javascript - 如何检查验证输入日期字段
- linux - 为什么我会从此代码中收到 Invalid typecast 错误?
- r - 文本清理 gsub 删除所有内容,直到找到换行符
- pytorch - PyTorch中如何优化指定范围内的参数?
- reactjs - React - 带有 `document.body` 的`createPortal` 导致点击事件立即触发
- api - 问题 avec mon API en python
- python - 使用 pytest.ini 进行日志记录。如何附加到文件?
- javascript - Datetimepicker 下拉菜单未全尺寸显示
- node.js - 使用 AWS cognito 通过 SMS OTP 注册和登录
- javascript - 即将离开网站时禁用自己的后退按钮?(不是浏览器实现的)