Mock は実際にこのビルトインのようなものを提供します。モックにはしばしば親モックがあります...例
somemock.foo # parent is somemock
親はモック API で直接公開されませんが、子の呼び出しは親に登録されます。
import mock
m = mock.Mock()
m.a('hello world')
m.b('goodbye world')
m.c('kittens!')
m.a('Howdy')
m.assert_has_calls([
mock.call.a('hello world'),
mock.call.b('goodbye world'),
mock.call.c('kittens!'),
mock.call.a('Howdy')
]) # passes silently
m.assert_has_calls([
mock.call.a('hello world'),
mock.call.b('goodbye world'),
mock.call.a('Howdy'),
mock.call.c('kittens!')
]) # Error
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# File "/usr/local/lib/python2.7/dist-packages/mock.py", line 863, in assert_has_calls
# 'Actual: %r' % (calls, self.mock_calls)
# AssertionError: Calls not found.
# Expected: [call.a('hello world'), call.b('goodbye world'), call.a('Howdy'), call.c('kittens!')]
# Actual: [call.a('hello world'),
# call.b('goodbye world'),
# call.c('kittens!'),
# call.a('Howdy')]
しかし、「私のモックはすべて同じ親に由来するわけではありません」と言うかもしれません。すべてはまだ失われていません!親を作成し、事後的に親にアタッチできます。
parent_mock = mock.Mock()
parent_mock.attach_mock(foomock, 'foo')
parent_mock.attach_mock(barmock, 'bar')
これで、上で行ったのと同じ種類のアサーションを行うことができます (元のモックの親を保持する必要がない限り...その場合、何を伝えればよいかわかりません...)