我有一个看起来像这样的测试函数(在 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)
显然存在上下文问题。
然而,更复杂的是,这个测试似乎是孤立地工作的,但当我运行我的所有测试时失败(其中许多几乎与此相同,但功能不同)。我完全不清楚我做了什么来使测试相互依赖。