【问题标题】:Testing classwide attributes测试类范围的属性
【发布时间】:2017-10-20 22:23:33
【问题描述】:

假设我有一个名为 foo 的模块,其类为 BarBar 有一个类范围的计数器属性,允许我跟踪创建实例的顺序。 foo 看起来像这样:

from itertools import count

class Bar:
    class_count = count(0)
    def __init__(self):
        self.id = self.class_count.next()

现在我有一个测试文件,我正在测试Bar 的各种功能。我不确定如何测试这个id 属性,因为其他单元测试正在创建Bar 的实例,所以我不知道Bar 实例的给定ID 应该是什么.此外,我班级的这种行为意味着我的单元测试彼此独立,这是不可取的。我应该如何构建我的单元测试以使测试彼此独立?

【问题讨论】:

  • 这很可能回答了你的问题:stackoverflow.com/questions/7460363/…
  • 这里的问题是:测试什么?基本上你只需要测试计数器的下一个方法是否被调用。测试计数器的功能不是你的工作。因此,模拟计数器并断言模拟是否按预期调用。

标签: python unit-testing class python-unittest


【解决方案1】:

您可以使用setUp 来保护当前计数,然后暂时重置计数。然后使用tearDown 再次恢复原始状态:

from itertools import count
import unittest

class Bar:
    class_count = count(0)
    def __init__(self):
        self.id = next(self.class_count)


class TestBar(unittest.TestCase):
    def setUp(self):
        self.nxtcount = next(Bar.class_count)  # safe current state
        Bar.class_count = count(0)             # reset to 0

    def tearDown(self):
        Bar.class_count = count(self.nxtcount) # reset to old state

    def teststh1(self):
        x = Bar()
        self.assertEqual(x.id, 0)

    def teststh2(self):
        x1 = Bar()
        x2 = Bar()
        x3 = Bar()
        self.assertEqual(x1.id, 0)
        self.assertEqual(x2.id, 1)
        self.assertEqual(x3.id, 2)

这可以确保每个测试方法都以 Bar.class_count 为 0 开始。

【讨论】:

    【解决方案2】:

    我会存根 Bar 以绕过构造函数。

    class BarStub(Bar):
      def __init__(self):
        self.class_count = None
        self.id = None
    

    现在你可以这样测试了:

    class TestBar(...):
      def setUp(...)
        ...
        self.bar = BarStub()
    
      def test_foo_should_blah_when_blah(self):
        with mock.patch.object(self.bar, 'count_class', side_effect=[...]) as mock_count:
          actual = self.bar.unit_under_test(...)
          mock_count.assert_called_with([...])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-13
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2017-09-15
      • 1970-01-01
      • 2014-09-29
      相关资源
      最近更新 更多