错误:单元测试时无法实例化接口符号



我正在尝试对注册方法进行单元测试,并遵循本指南。我对单元测试相当陌生。

我不断得到

1( 应用\测试\控制器

\注册控制器测试::测试注册错误:无法 实例化接口 Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface

/Applications/MAMP/htdocs/my_project/tests/Controller/SignUpControllerTest.php:19

我只是认为我做这个单元测试不正确。这是我所拥有的。我不确定我在做什么。我想做的只是测试注册方法。

用户控制器.php

public function signup(Request $request, UserPasswordEncoderInterface $passwordEncoder )
{
$user = new User();
$entityManager = $this->getDoctrine()->getManager();
$user->setEmail($request->get('email'));
$user->setPlainPassword($request->get('password'));
$user->setUsername($request->get('username'));
$password = $passwordEncoder->encodePassword($user, $user->getPlainPassword());
$user->setPassword($password);
$entityManager->persist($user);
$entityManager->flush();
return $this->redirectToRoute('login');

}

注册控制器测试.php

namespace AppTestsController;
use AppEntityProduct;
use AppControllerUserController;
use AppEntityUser;
use DoctrineCommonPersistenceObjectManager;
use DoctrineCommonPersistenceObjectRepository;
use SymfonyBundleFrameworkBundleTestWebTestCase;
use SymfonyComponentSecurityCoreEncoderUserPasswordEncoderInterface;
use SymfonyBundleFrameworkBundleTestKernelTestCase;
class SignUpControllerTest extends WebTestCase
{
public function testSignUp()
{   
$passwordEncoder = new UserPasswordEncoderInterface();
$user = new User();
$user->setEmail('janedoe123@aol.com');
$user->setPlainPassword('owlhunter');
$user->setUsername('BarnMan');
$password = $passwordEncoder->encodePassword($user, $user->getPlainPassword());
$user->setPassword($password);
$userRepository = $this->createMock(ObjectRepository::class);
$userRepository->expects($this->any())
->method('find')
->willReturn($user);

$objectManager = $this->createMock(ObjectManager::class);
// use getMock() on PHPUnit 5.3 or below
// $objectManager = $this->getMock(ObjectManager::class);
$objectManager->expects($this->any())
->method('getRepository')
->willReturn($userRepository);
$userController = new UserController($objectManager);
$this->assertEquals(2100, $userController->signupTest());
}

}

错误非常明显。在testSignUp方法的第一行中,您正在从接口创建一个实例,这在PHP中无法完成。

要在单元测试中从接口创建可用对象,请创建该对象的模拟对象。为此,请阅读 PHP 单元文档。

WebTestCase

应用程序测试是PHP文件,通常存在于应用程序的tests/Controller/目录中,它告诉Symfony我们需要必要的工具来与我们的应用程序通信,就好像我们通过HTTP这样做一样。

内核测试

使用 for 从依赖注入容器中获取服务 它可以帮助您在测试中创建和引导内核

这就是为什么我建议你使用内核测试用例

use SymfonyBundleFrameworkBundleTestKernelTestCase;
class SignUpControllerTest extends KernelTestCase
{
private $passwordEncoder;
protected function testSignUp(): void
{
self::bootKernel();
$this->passwordEncoder= self::getContainer()->get('SymfonyComponentSecurityCoreEncoderUserPasswordEncoderInterface');
}
public function addShoes3()
{
$passwordEncoder = $this->passwordEncoder;
//continue
}
}

最新更新