Ошибка: не удается создать экземпляр интерфейса Symfony при модульном тестировании - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь выполнить модульный тест для метода регистрации, и я следую этому руководству . Я довольно новичок в модульном тестировании.

я продолжаю получать

1) Ошибка приложения \ Tests \ Controller \ SignUpControllerTest :: testSignUp: невозможно инстанцировать интерфейс Symfony \ Component \ Security \ Основные \ кодировщика \ UserPasswordEncoderInterface

/ Applications / MAMP / HTDOCS / my_project / Тесты / Controller / SignUpControllerTest.php: 19

Я просто не думаю, что я делаю этот модульный тест правильно. Вот что у меня есть. Я не уверен в том, что я делаю. Все, что я хочу сделать, это проверить метод регистрации.

UserController.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');



}

SignUpControllerTest.php

namespace App\Tests\Controller;

use App\Entity\Product;
use App\Controller\UserController;
use App\Entity\User;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Common\Persistence\ObjectRepository;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

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());

    }


}

1 Ответ

0 голосов
/ 25 августа 2018

Ошибка очень ясна.В первой строке вашего метода testSignUp вы создаете экземпляр из интерфейса, что не может быть сделано в PHP.

Чтобы создать полезный объект из интерфейса в модульном тестировании, создайте его фиктивный объект.Для этого прочитайте документацию по PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...