Python class' __str__ 的测试覆盖率

Python test coverage for class' __str__

我有一个关于 Python 使用 PyCharm IDE 覆盖率测试的非常基本的问题。在我的 Django 模型中,所有 __str__ 方法都没有包含在我的测试中。

class Category(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

测试这些的合适方法是什么?

这不起作用,测试运行但 __str__ 方法仍未被视为涵盖。

class TestCategory(TestCase):

    def test_category(self):
        category = Category.objects.create(name='Test Category')
        self.assertEqual(category.__str__(), 'Test Category')

每当您对对象调用 str() 时,都会调用 __str__() 方法。

您应该尝试在实例对象上使用 str() 方法。

class TestCategory(TestCase):

    def test_category(self):
        category = Category.objects.create(name='Test Category')
        self.assertEqual(str(category), 'Test Category')

Astik Anand 已经提供了一个很好的答案,解释了如何技术上 强制执行 __str__() 方法。但是,我想通过稍微不同的解释来回答您的问题 - 还要考虑评论中的新信息,即覆盖工具似乎有问题:

"How should I test the __str__() method although I know that my coverage tool is buggy and no matter what I have tried so far my tests will not get __str__() marked as covered by the tool?".

退一步。忘记覆盖范围。覆盖范围不是您的目标。您的目标是找到可能在 __str__() 中发现的所有错误。因此,请尽可能彻底地测试 __str__() 以达到此目标。这是测试 __str__() 的方法(从精神上,而不是技术上)。

抱歉,如果您认为这很清楚 - 您将无法相信人们在面对错误的覆盖工具时所做的事情来达到他们的覆盖目标...

我遇到了同样的问题。我使用

中的以下信息解决了这个问题

https://django-testing-docs.readthedocs.io/en/latest/coverage.html

  1. pip install django-nose

  2. settings.py

    django_nose 添加到 INSTALLED_APPS

    另外,在文件底部添加:

    TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
    NOSE_ARGS = [
     '--with-coverage',
     '--cover-package=app_1,app_2',
     '--cover-html' ]  
    

我从命令行 运行 覆盖了 HTML,报告显示我的模型中的 __str__ 方法被覆盖了。