В настоящее время я пишу небольшую библиотеку, которая взаимодействует с сервером сборки bamboo. Тестирование проводится с помощью pytest. Я застрял на следующей проблеме. Я хочу протестировать цикл while, который выполняется до тех пор, пока какой-либо статус не будет удовлетворен. Прочитав документ pytest, я попытался «издеваться»/обезьянить статус, но на самом деле это не работает. Я, вероятно, делаю что-то элементарное неправильно здесь: это цикл while, о котором идет речь:
# determine current status
running = self._is_a_build_running()
# turn on and off running powerplug while building
while running:
self.feedback.turn_off_success()
self.feedback.turn_on_running()
time.sleep(self.blinker_time)
self.feedback.turn_off_running()
self._update_builds_status()
running = self._is_a_build_running()
поэтому с помощью pytest я пытался создать фикстуру для положительного и отрицательного _is_a_build_running
следующим образом:
@pytest.fixture(scope='function')
def mock_is_a_build_running():
return False
а затем с помощью этого тестового метода с использованием ThreadPool (объяснено здесь как получить возвращаемое значение из потока в python?), потому что мне также понадобится результат от метода, содержащего цикл while.
def test_update_status_running(bamboopickups, monkeypatch,
mock_update_overall_data_positive,
mock_update_builds_status_positive,
mock_is_a_build_running):
monkeypatch.setattr('BambooPickup._update_overall_data', lambda x: mock_update_overall_data_positive)
monkeypatch.setattr('BambooPickup._update_builds_status', lambda x: mock_update_builds_status_positive)
pool = ThreadPool(processes=1)
async_result = pool.apply_async(bamboopickups.update_status())
monkeypatch.setattr('BambooPickup._update_overall_data', lambda x: mock_update_overall_data_positive)
monkeypatch.setattr('BambooPickup._is_a_build_running', lambda x: mock_is_a_build_running)
actual = async_result.get()
expected = True
assert actual == expected
Вероятно, это легко сделать с помощью pytest-mock, но пока я использовал только предпочтительный способ, описанный здесь: http://pytest.org/latest/monkeypatch.html.