- ApiPlatform 3.2
- Symfony 6.4
- PhpUnit 9.5
- PHP 8,0
При вызове конечной точки пользователь должен быть обратимо удален и несколько поля с конфиденциальными данными должны быть установлены на ноль или перезаписаны тарабарщиной. Пользователь должен соответствовать некоторым условиям, прежде чем его можно будет удалить.
Легко проверить, выполняет ли конечная точка ожидаемый результат, просматривая возвращенные данные ответа или извлекая пользователя из базы данных.
Меня также просят проверить, вызывается ли метод 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