2016-11-08 7 views
0

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

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

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

    } 



} 

ответ

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

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

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

Смежные вопросы