3

我有一个看起来像这样的测试函数(在 unitttest.TestCase 内):

@patch('some.list')
def test_thing(self, mocklist):
  # some setup code
  mocklist.__iter__.return_value = self.preCreatedList
  with patch('some.other.object', new=self.preCreatedObject):
    #some.other.object uses the mocked list internally
    self.assertEqual(some.other.object.sut('foo'), fooResult)
    self.assertEqual(some.other.object.sut('bar'), barResult)
    mocklist.__iter__.return_value = ['bogusList']
    self.assertEqual(some.other.object.sut('foo'), failureResult)

当然,对于最后一个断言,如果列表包含无效项目,我想确认正确的行为。

问题是这样的:当我从被测函数内部打印列表时,它总是等于preCreatedList. 尽管在最终断言之前进行了赋值,但它并没有设置为['bogusList']. 为什么?

Python 2.7.5,使用nose2 运行测试。

注意:请抛开这些断言是否都应该在同一个测试中的问题;我理解将它们分开的论点,这实际上可能解决了这个问题——但我真的很想了解我所观察到的行为。


更新:当我像这样修改代码时,它可以工作:

@patch('some.list')
def test_thing(self, mocklist):
  # some setup code
  mocklist.__iter__.return_value = self.preCreatedList
  with patch('some.other.object', new=self.preCreatedObject):
    #some.other.object uses the mocked list internally
    self.assertEqual(some.other.object.sut('foo'), fooResult)
    self.assertEqual(some.other.object.sut('bar'), barResult)
  mocklist.__iter__.return_value = ['bogusList']
  with patch('some.other.object', new=self.preCreatedObject):
    self.assertEqual(some.other.object.sut('foo'), failureResult)

显然存在上下文问题。

然而,更复杂的是,这个测试似乎是孤立地工作的,但当我运行我的所有测试时失败(其中许多几乎与此相同,但功能不同)。我完全不清楚我做了什么来使测试相互依赖。

4

0 回答 0