#symfony #testing #race-condition
Вопрос:
Я пытаюсь вызвать PESSIMISTIC_WRITE
ошибку в существующем коде (т. Е. устаревшем коде) из функционального теста.
Это мой тестовый код:
public function shouldReturnAnErrorWhenAcceptingAnHmrInARaceCondition(FunctionalTester $I) {
$I->authenticatePharmacist('9998');
/** @var DoctrineORMEntityManager $entity_manager */
$entity_manager = $I->grabService('doctrine.orm.entity_manager');
$hmr_id = 1;
$hmr = $entity_manager->find('HMRXCoreBundleEntityHmr', $hmr_id, LockMode::PESSIMISTIC_WRITE);
$hmr->setAssignedPharmacist(null);
/** @var HMRXCoreBundleEntityHmrStatus $hmr_status */
$hmr_status = $I->grabEntityFromRepository(HMRXCoreBundleEntityHmrStatus::class, ['name' => 'new']);
$hmr->setStatus($hmr_status);
$I->haveInRepository($hmr);
// Does committing the changes release the PESSIMISTIC_WRITE? Try grabbing it again
$hmr = $entity_manager->find('HMRXCoreBundleEntityHmr', $hmr_id, LockMode::PESSIMISTIC_WRITE);
$I->seeJsonInPostResponse([
'error' => true,
'message' => 'An error occurred. The HMR may have been assigned.',
'data' => null,
], "/app/hmr/accept/{$hmr_id}", ['cvn' => '123']);
}
Это код, который я тестирую:
try {
// Load the HMR and lock it to prevent other users to update it at the same time
/** @var Hmr $hmr */
$hmr = $entity_manager->find('HMRXCoreBundleEntityHmr', $hmrId, LockMode::PESSIMISTIC_WRITE);
// ...
// Immediately change HMR status
$previousStatus = $hmr->getStatus();
$hmr->setStatus($pendingPaymentHmrStatus);
$entity_manager->persist($hmr);
$entity_manager->flush();
}
catch(PessimisticLockException $e) {
$entity_manager->getConnection()->rollBack();
return new StdResponse('An error occurred. The HMR may have been assigned.', null, true);
}
Последние четыре строки выполняются, хотя я ожидал, что произойдет исключение и попадет в catch
блок. Теперь, может быть, я не понимаю, как PESSIMISTIC_WRITE
это работает.
Как я могу запустить выполнение кода в catch
блоке из моего теста?