2016-11-08 10 views
0

私は新しいことをテストしています、私はコード化とphppunitいくつかの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); 

    } 



} 

答えて

1
  1. おそらく$アクションなどのパラメータを指定して、他の方法にtestShouldHandleASuccessfulFormSubmissionForAddANewsの身体とtestShouldHandleASuccessfulFormSubmissionForEditANewsを抽出することができます=「追加」|として、[編集]を(またはあなたの定義されたあらわす定数NewsFormHandler :: EDITなどを使用)、それらほとんど同じです。

  2. 上記のメソッドからモック作成を抽出するには、プロセスがほぼ同じである(メソッド引数との違いを渡して、汚い作業をさせる)ようにします。

  3. ます。また、ページ内の例のように、BDDスタイルを使用して、いくつかの読みやすさを追加することができます
  4. http://codeception.com/docs/05-UnitTests#BDD-Specification-Testing