PHPUnit Symfony Test Case ошибка

1

Я новичок в Symfony, я написал небольшое приложение, теперь нужно добавить модульные тесты, вот мой контроллер:

<?php
namespace myBundle\Controller;

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;

class IndexController extends AbstractController
{

    /**
     * @param \Symfony\Component\HttpFoundation\Request $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function indexAction(Request $request)
    {

        if ($this->getRequest()->isMethod('POST')) {
            // Do Something
        }

        // Do Something otherwise
    }
}

Мой тест:

class IndexControllerTest extends \PHPUnit_Framework_TestCase
{
    protected $testController;

    public function setUp()
    {

        $this->testController =
            $this->getMockBuilder('myBundle\Controller\IndexController')
                ->disableOriginalConstructor()
                ->getMock();

    }

    public function testPostSaveActionWithBadRequest()
    {
        $expectation = 'Some text ';

        $response = $this->testController->indexAction(new Request);
        $this->assertInstanceOf(
            'Symfony\Component\HttpFoundation\JsonResponse',
            $response
        );
        $content = json_decode($response->getContent());
        $this->assertEquals($expectation, $content->error);
    }

}

Когда я запускаю этот тест, я получаю следующее:

PHP Неустранимая ошибка: вызов функции-члена get()

который в основном находится на следующей линии

if ($this-> getRequest() → isMethod ('POST')) {

это говорит мне, что контейнер равен null (я проверил его, распечатав дамп контейнера).

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

Я очень ценю всю помощь.

спасибо FI

  • 2
    Я бы не стал писать модульные тесты для контроллера, которые расширяют класс Controller из FrameworkBundle. Как вы только что заметили, насмешка над контейнером превращается в кошмар. Я бы либо зарегистрировал контроллер как сервис и явно ввел бы все зависимости, либо вместо этого создал бы функциональные тесты .
  • 0
    Если вы тестируете свою веб-страницу в браузере, она работает? Какой класс класса AbstractController ? Вы также рассматривали возможность использования Symfony\Bundle\FrameworkBundle\Test\WebTestCase вместо \PHPUnit_Framework_TestCase ?
Показать ещё 1 комментарий
Теги:
phpunit

1 ответ

4

Вы пытаетесь издеваться над классом, который вы должны проверить:

$this->testController =
    $this->getMockBuilder('myBundle\Controller\IndexController')
        ->disableOriginalConstructor()
        ->getMock();

Фактически вы должны создать экземпляр класса, который вы тестируете, и высмеивать или блокировать его сотрудников.

Однако в этом конкретном сценарии вместо написания модульного теста напишите функциональный тест. Там есть глава о написании функциональных тестов в документах Symfony, которые помогут вам.

Контроллер использует множество классов фреймворка (классы, которые не принадлежат вам), и вы также не должны их издеваться над ними. Вот почему функциональные тесты в этом случае лучше. Кроме того, убедитесь, что вы перемещаете как можно больше кода из своего контроллера, чтобы вы могли правильно протестировать эту часть (и написать как можно меньше функциональных тестов).

Тем временем прочитайте несколько книг по модульному тестированию (в следующем порядке):

  • 0
    даже в качестве службы я получаю контейнер, но запрос по-прежнему равен NULL, т.е. $ this-> getRequest () == NULL
  • 0
    Это не будет волшебным образом появиться там. Это одна из причин, по которой вам следует писать интеграционные тесты, а не модульные тесты для кода, использующего сторонние классы - вы можете ошибаться в предположениях о том, что сторонние классы делают для вас. Symfony устанавливает запрос на службу стека запросов с одним из ваших слушателей. Скорее всего, вы не делаете то же самое в своем тесте, и поэтому getRequest () возвращает значение null.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню