いくつかの方法があるとしましょう:
def sleep(self, seconds=0):
seconds = seconds or self.wait_timer
time.sleep(seconds)
そしてメソッド呼び出し元:
def _sleep_before_next(self, number: int) -> None:
for counter, wait_timers in self.SLEEPING_RANGES.items():
if number % counter == 0:
self.sleep(random.choice(wait_timers))
self.sleep
のいずれかで呼び出されることをテストしたいwait_timers
。可能なオプション:
最初は私が今使っているものです: patchrandom.choice
は常に最初の要素を返し、次に mock の を使用しますassert_has_calls
。
@mock.patch('random.choice', lambda iterable: iterable[0])
@mock.patch.object(MyClass, 'sleep')
def test_sleep_before_next_calling_time_sleep_with_correct_time(self, mock_time):
self.my_class_instance._sleep_before_next(30)
assert mock_time.call_count == 3
calls = [mock.call(2), mock.call(3), mock.call(10)]
mock_time.assert_has_calls(calls, any_order=True)
2番目のオプションはrandom.choice
、必要なwait_timers
ものが渡されたことを観察して確認することです。このどちらのオプションでも、2 つのオブジェクトをモックする必要がありました。したがってunittest.mock
、モックの数を減らすために、いくつかのパラメーターの1つが関数に渡されているかどうかを確認できるかどうかをさまよっています。
>>> my_mock(20)
>>> my_mock.time.assert_called_with_one_of(10, 20, 30)
>>> True