2017-09-21 7 views
0

私には疑問が1つありますテストメソッドの名前付け方法最後に大きなプロジェクトに単体テストを行い、経験に基づいて名前テストメソッドが悪いと思う私のコードについての例をここに示します。 テストメソッドの名前を正しく指定するにはどうすればいいですか

public function notificationApproved(Request $request, User $user) { 
    $user    = $user->getId(); 
    $request   = $request->getRequest(); 
    $this->notification = $this->em->getRepository('AppBundle:Notification')->find(Notification::APPROVED); 
    $this->notificationCategory = NotificationCategory::APPROVED; 
    $this->notificationStatus  = $this->em->getRepository('AppBundle:NotificationStatus')->find(1); 
    $this->reason     = $reason; 
    //notification approvers project 
    foreach ($projectHasUserUnits as $keyData => $valueData) { 
     $projectUserUnitResponsability = $valueData->getProjectUserUnitResponsability()->last();         
     $responsability    = $projectUserUnitResponsability->getResponsabilityProject(); 
     if (is_null($projectUserUnitResponsability->getEndAt()) && ($responsability->getId() == Responsability::TYPE_RESPONSIBLE || $responsability->getId() == Responsability::TYPE_ACCOUNT_MANAGER || $responsability->getId() == Responsability::TYPE_PROJECT_MANAGER)) { 
      $user = $valueData->getUserHasUnit()->getUser(); 
      if(!in_array($user,$this->users)){ 
       $this->users[] = $user; 
       $description_label = 'notification_description_project_50'; 
       $short_description = 'notification_content_project_50'; 
       $notification = $this->generateNotification($Project, $user, $description_label,$short_description); 
       if ($notification) { 
        $this->notificationTrigger 
             ->sendProjectNotification($user, $notification, $Project 
              , $notification->getDescription(), date('l m-d-y H:i a')); 
       } 
      } 
     } 
    } 
} 

それで大きな方法、私は知っているが、それ自体はすべてで来たときにだけ、この場合は、条件文を参照してください、そして、このようなメソッドのテストに名前を付ける方法を考えて、そのロジックのために心配しないでください条件:...多分:

test_notificationApprovedWhenAllConditionsAreTrue 
test_notificationApprovedWhenProjectHasUserUnitsIsBiggerThanZeroAndProjectUserUnitResponsabilityGetEndAtIsNotNullAndResponsabilityGetIdIsEqualToResponsabilityTYPERESPONSABILITYorResponsabilityGetIdIsEqualToResponsabilityTYPE_PROJECT_MANAGERanduserInArrayIsTrueAndNotificationIsTrue... 

あなたはそれを読んでいると想像してください!

しかしそれだけで1つの条件が簡単です来るときに上記、もちろん!このような!

test_notificationApprovedWhenProjectHasUserUnitsIsBiggerThanZeroAndProjectUserUnitResponsabilityGetEndAtIsNotNullAndResponsabilityGetIdIsEqualToResponsabilityTYPERESPONSABILITYorResponsabilityGetIdIsEqualToResponsabilityTYPE_PROJECT_MANAGER 

私はテスト内部のコメントを試してみたが、テストが失敗した場合、アイデアが希望その名前のために指導してください(エラーを迅速に修正するため)

あなたは考えていますか?

答えて

1

私は試験方法の名称をgiven<one-or-more-conditions>_action_resultといい経験があります。あなたのケースのためだけの簡単な例:

test_givenUserUnitGreaterThanZeroAndProjectIdEqualToOne_whenApproveNotification_thenNotificationIsSent() 

私は読みやすさのために物事を単純化してきましたが、あなたはポイントを得ます。この命名法は、行動主導のテストフレームワークから取られています。 test_を必要としない言語では、それを保存することができます。

テストはコード品質にとって本当に良い指標です。一般的に言えば、単体テストを書くのが簡単なのは、テストするコードが「良い」品質であるからです。

  • リスト、それは正確に1つのアクションのユースケース
  • のために必要であるとおりに、すべての前提条件:あなたは、いくつかの簡単なガイドラインに従うことができます。複数のテストをしない場合。
  • 正確に1つの結果。そうでない場合は、メソッドを抽出して個別にテストします。
  • メソッド名があるため、多くの前提条件が長すぎる取得する場合はこの1つがあまりにも多くの責任
+0

コードの品質の一部を少し明確にするために私の答えを少し編集しました。 –

+0

ロジックの複雑さがわからないときは別のロジックを試してみるのは難しい – jjoselon

+0

リファクタリングは別のトピックですが、このネーミングスキームはまだ使用できます。 –

1

アドバイスのビットを持っているので、新しいクラスを抽出するための時間かもしれません:あなたは、テストの注釈を追加したい場合は、メソッド名の先頭にtestを付ける必要はありません。

/** 
* @test 
*/ 
function givenThis_producesThat() { 
関連する問題