Codeception улучшает модульный тест готовности

Я новичок в тестировании, я использую codeception и phpunit для выполнения TDD.

Однако в моих методах много кода. Использовал ли я лучшие практики? Есть ли способ повысить готовность моего кода, можно ли он быть более чистым?

class NewsFormHandlerTest extends \Codeception\Test\Unit
{
    /**
     * @var \UnitTester
     */
    protected $tester;

    protected function _before()
    {
    }

    protected function _after()
    {
    }

    private function getFormMock(){

        return $this->getMockBuilder(FormInterface::class)
            ->disableOriginalConstructor()
            ->getMock();
    }

    private function getNewsManagerMock(){

        return $this->getMockBuilder(INewsManager::class)
            ->disableOriginalConstructor()
            ->getMock();
    }

    // tests

    public function testShouldHandleASuccessfulFormSubmissionForAddANews()
    {

        // prepare
        $request = new \Symfony\Component\HttpFoundation\Request();
        $news = new News();

        $form = $this->getFormMock();
        $form->expects($this->once())
            ->method('isValid')
            ->will($this->returnValue(true));

        $form->expects($this->once())
            ->method('submit');

        $form->expects($this->once())
            ->method('getData')
            ->will($this->returnValue($news));

        $newsManager = $this->getNewsManagerMock();
        $newsManager->expects($this->once())
            ->method('add');

        $user = Stub::make(WebserviceUser::class, []);

        // test
        $handler = new NewsFormHandler($newsManager, $user);
        $newsReturned = $handler->handle($form, $request, NewsFormHandler::ADD);

        // assert
        $this->assertInstanceOf(News::class, $newsReturned);
        $this->assertEquals($news, $newsReturned);

    }

    public function testShouldHandleASuccessfulFormSubmissionForEditANews()
    {

        // prepare
        $request = new \Symfony\Component\HttpFoundation\Request();
        $news = new News();

        $form = $this->getFormMock();
        $form->expects($this->once())
            ->method('isValid')
            ->will($this->returnValue(true));

        $form->expects($this->once())
            ->method('submit');

        $form->expects($this->once())
            ->method('getData')
            ->will($this->returnValue($news));

        $newsManager = $this->getNewsManagerMock();
        $newsManager->expects($this->once())
            ->method('edit');

        $user = Stub::make(WebserviceUser::class, []);

        // test
        $handler = new NewsFormHandler($newsManager, $user);
        $newsReturned = $handler->handle($form, $request, NewsFormHandler::EDIT);

        // assert
        $this->assertInstanceOf(News::class, $newsReturned);
        $this->assertEquals($news, $newsReturned);

    }

    public function testFailFormWithInvalidData()
    {

        // prepare
        $request = new \Symfony\Component\HttpFoundation\Request();

        $form = $this->getFormMock();
        $form->expects($this->once())
            ->method('isValid')
            ->will($this->returnValue(false));


        $newsManager = $this->getNewsManagerMock();
        $newsManager->expects($this->never())
            ->method('edit');

        $this->expectException(InvalidFormException::class);

        $user = Stub::make(WebserviceUser::class, []);

        // test
        $handler = new NewsFormHandler($newsManager, $user);
        $newsReturned = $handler->handle($form, $request, NewsFormHandler::ADD);

        // assert
        $this->assertNull($newsReturned);

    }



}

person Xero    schedule 08.11.2016    source источник


Ответы (1)


  1. Вероятно, вы можете извлечь тело testShouldHandleASuccessfulFormSubmissionForAddANews и testShouldHandleASuccessfulFormSubmissionForEditANews в другой метод с параметром вроде $ action = 'add' | 'edit' (или использовать определенные вами константы NewsFormHandler :: EDIT и т. Д.), Поскольку они почти одинаковы.

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

  3. Вы также можете улучшить читаемость, используя стиль BDD, как в примере на странице http://codeception.com/docs/05-UnitTests#BDD-Specification-Testing

person Konrad Gałęzowski    schedule 11.12.2016