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