次のようなAPI呼び出しをモックする関数があります。
def mocked_api_call(animal = animal, soundtype=soundtype)
output = make_sound(animal, soundtype)
return output
目標は、モックが同じ引数のセットで2回呼び出されたときに、異なる出力を返すようにすることです。たとえば、最初の呼び出しで「meow」を返し、2回目で「MEAAAOWWW」を返し、3回目の呼び出しで「mew」を返すようにします。
output = mocked_api_call(animal='cat', soundtype = 'meow')
# outputs 'meow'
output = mocked_api_call(animal='cat', soundtype = 'meow')
# outputs 'MEAAAOWWW'
output = mocked_api_call(animal='cat', soundtype = 'meow')
# outputs 'mew'
パッチは、APIを呼び出す関数を使用する親関数をテストするために使用されます。
def parent_function(**kwargs):
response = make_sound(animal=animal, soundtype=soundtype)
テスト関数は、次のようにモンキーパッチを介して呼び出されます。
@mock.patch('myscript.api_call', side_effect=mocked_api_call)
def test_parent_function(*args, **kwargs):
output = parent_function(**kwargs)
しかし、関数が呼び出された回数に依存する応答を生成する方法を見つけることができません。これはpytestでできることですか?
テストがどのように表示されるかは完全にはわかりませんが、テストごとにコールインデックスがリセットされる、さまざまなテストが必要であると仮定します。以下は、ニーズによっては少し一般的すぎるmake_sound
場合があります。必要なのがそれだけの場合は、インデックスをに渡すこともできます。
from unittest import mock
import pytest
class TestSounds:
indexes = {}
sounds = {
('cat', 'meow'): ('meow', 'MEAAAOWWW', 'mew'),
}
@classmethod
def make_sound(cls, animal, soundtype):
key = (animal, soundtype)
if key in cls.sounds:
index = cls.indexes.setdefault(key, 0)
sound = cls.sounds[key][index]
cls.indexes[key] = (index + 1) % len(cls.sounds[key])
return sound
# if you need the order not be reset in each test, you can change
# the scope to "class"
@pytest.fixture(scope="function", autouse=True)
def reset_indexes(self):
self.__class__.indexes = {}
def test_parent_function(self, **kwargs):
with mock.patch('myscript.api_call',
side_effect=[self.make_sound(**kwargs),
self.make_sound(**kwargs)]):
output1 = parent_function(**kwargs)
output2 = parent_function(**kwargs)
これはテストされていないことに注意してください、しかしそれはあなたにいくつかのアイデアを与えるかもしれません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加