Утвердить, что при запуске теста конечной точки API вызывается определенный метод.Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Утвердить, что при запуске теста конечной точки API вызывается определенный метод.

Сообщение Anonymous »

Версии стека:
  • ApiPlatform 3.2
  • Symfony 6.4
  • PhpUnit 9.5
  • PHP 8,0
Написание теста для конечной точки DELETE ресурса User.
При вызове конечной точки пользователь должен быть обратимо удален и несколько поля с конфиденциальными данными должны быть установлены на ноль или перезаписаны тарабарщиной. Пользователь должен соответствовать некоторым условиям, прежде чем его можно будет удалить.
Легко проверить, выполняет ли конечная точка ожидаемый результат, просматривая возвращенные данные ответа или извлекая пользователя из базы данных.
Меня также просят проверить, вызывается ли метод NewsletterService::removeUserFromAllLists(). Поэтому я создал макет объекта и заменил NewsletterService из тестового контейнера на макет.
Однако при выполнении запроса в действие DeleteUserAction внедряется настоящий NewsletterService. Почему?
Сообщение об ошибке:
There was 1 failure:

1) App\Tests\Functional\Entity\UserTest::testErase()
Expectation failed for method name is "removeUserFromAlLists" when invoked 1 time(s).
Method was expected to be called 1 times, actually called 0 times.

Тестовый код:
use ApiPlatform\Symfony\Bundle\Test\ApiTestCase;
use App\Entity\Enum\User\UserErasedReasonsEnum;
use App\Entity\User;
use App\Factory\UserFactory;
use App\Service\NewsletterService;
use Doctrine\ORM\EntityManagerInterface;
use PHPUnit\Framework\MockObject\MockObject;
use Zenstruck\Browser\HttpOptions;
use Zenstruck\Browser\Test\HasBrowser;
use Zenstruck\Foundry\Test\Factories;
use Zenstruck\Foundry\Test\ResetDatabase;

class UserTest extends ApiTestCase
{
use ResetDatabase;
use Factories;
use HasBrowser;

public function testErase(): void
{
static::bootKernel();
$container = static::getContainer();

$userToAuthenticate = UserFactory::createOne();
$user = UserFactory::createOne([]);

$newsletterServiceMock = $this->createMock(NewsletterService::class);
$newsletterServiceMock->expects($this->once())
->method('removeUserFromAlLists')
->with('email', $user->getEmail());
$container->set(NewsletterService::class, $newsletterServiceMock);

$erasedDate = (new \DateTime())->setTime(0, 0);
$erasedReason = (string)UserErasedReasonsEnum::WHATEVER;

$this->browser()
->disableReboot()
->actingAs($userToAuthenticate->_real())
->delete($this->getIriFromResource($user))
->assertSuccessful()
;
}

}

DeleteUserActionCode:
use App\Service\NewsletterService;
use Symfony\Bundle\SecurityBundle\Security;
use PHPUnit\Framework\MockObject\MockObject;

class DeleteAction
{
public function __construct(
private readonly Security $security,
private readonly NewsletterService $newsletterService,
) {}

public function __invoke(Request $request, int $id): Response
{
$user = $this->security->getUser();

$this->newsletterService->removeUserFromAlLists($user->getEmail());
// dd($this->newsletterService instanceof MockObject ? 'true' : 'false');
// When not commented returns false

// ...
}
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... point-test
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»