【问题标题】:Django Unit Testing 'else' statement in a View to achieve coverage视图中的 Django 单元测试“else”语句以实现覆盖
【发布时间】: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


    【解决方案1】:

    据我所知,您没有在此测试用例上直接或间接调用 index() 方法。为了证明给自己添加一个调试器(ipdbpycharm debugger - 没关系)或在 else 语句上引发一些错误并再次运行测试。它应该像以前一样运行。

    如果你想写测试用例看看这个例子这个例子How to write a unit test for a django view? 在你的情况下,它应该看起来像这样:

    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
    
    

    附言self.clientdjango.test.Client 的实例,但请检查您的项目 BaseTestCase,您可能已经定义了一个。

    【讨论】:

    • 添加response = self.client.get( 成功了!我在上面的另一种方法中有相同的客户端响应测试代码,我不知道我需要在上面的 unittest 中使用另一个语句。猜猜我正在学习这就是您在测试 if/else 分支时所需要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2021-06-07
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多