Как я могу проверить состояние гонки в Symfony?

#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 блоке из моего теста?