Python mock - 重新分配return_value不起作用

时间:2013-06-28 12:24:16

标签: python python-2.7 mocking nose2

我有一个测试函数(在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)

显然存在背景问题。

然而,为了使事情进一步复杂化,这个测试看起来似乎是孤立的,但是在我运行所有测试时失败了(其中许多测试几乎与此相同,但是用于不同的功能)。我完全不清楚我做了什么让测试相互依赖。

0 个答案:

没有答案