我对如何命名测试方法有一个疑问,因为我最后对一个大项目进行了单元测试,根据我的经验我觉得我设置名称测试方法不好或者更差,这是一个关于我的代码的例子。
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...
你只能想象阅读!
然而,当它出现时只有一个条件比以上更容易!当然!,像这样:
test_notificationApprovedWhenProjectHasUserUnitsIsBiggerThanZeroAndProjectUserUnitResponsabilityGetEndAtIsNotNullAndResponsabilityGetIdIsEqualToResponsabilityTYPERESPONSABILITYorResponsabilityGetIdIsEqualToResponsabilityTYPE_PROJECT_MANAGER
我已尝试在测试中添加注释,但如果测试失败,那么这个想法将指导其名称(以快速修复错误)
那么,你有什么想法吗?
答案 0 :(得分:1)
我对given<one-or-more-conditions>_action_result
命名测试方法有很好的经验。只是一个简单的例子:
test_givenUserUnitGreaterThanZeroAndProjectIdEqualToOne_whenApproveNotification_thenNotificationIsSent()
为了便于阅读,我简化了一些事情,但你明白了。这种命名法取自行为驱动的测试框架。在不需要test_
的语言中,您可以保存它。
测试确实是代码质量的良好指标。一般来说,如果编写单元测试很容易,那就是因为要测试的代码具有“好”的质量。您可以遵循一些简单的指导原则:
答案 1 :(得分:1)
一些建议:如果您添加测试注释,则不需要使用test
为方法名称加前缀。
/**
* @test
*/
function givenThis_producesThat () {