次のようなテスト関数 (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)
明らかにコンテキストの問題があります。
ただし、さらに複雑なことに、このテストは単独で機能しているように見えますが、すべてのテストを実行すると失敗します (その多くはこれとほぼ同じですが、機能が異なります)。テストを相互依存させるために私が何をしたかは、私にはまったく明らかではありません。