PHPMD говорит мне, что я должен избегать блокирования else в этом тесте, но в этом случае я не могу найти способ удалить их.
Вот код:
if ($fight->c1 == NULL) {
if ($fight->c2 == NULL) {
// C1 and C2 Is Bye
$this->assertEquals($parentFight->$toUpdate, NULL);
}
else {
// C1 Is Bye
$this->assertEquals($parentFight->$toUpdate, $fight->c2);
}
}
else {
if ($fight->c2 == NULL) {
// C2 Is Bye
$this->assertEquals($parentFight->$toUpdate, $fight->c1);
}
else {
// C1 and C2 Are all set
$this->assertEquals($parentFight->$toUpdate, NULL);
}
}
Любая идея???
Это также можно сделать с помощью троичного оператора, что-то вроде этого.
if (!$fight->c1) {
$this->assertEquals($parentFight->$toUpdate, ($fight->c2 ?: null));
}
if (!$fight->c2) {
$this->assertEquals($parentFight->$toUpdate, ($fight->c2 ?: null));
}
Есть еще один способ сделать это:
if(($fight->c1 == null && $fight->c2 == null) || ($fight->c1 != null && $fight->c2 != null)) {
// C1 and C2 Is Bye
// C1 and C2 Are all set
$this->assertEquals($parentFight->$toUpdate, null);
} else if($fight->c1 == null && $fight->c2 != null) {
// C1 Is Bye
$this->assertEquals($parentFight->$toUpdate, $fight->c2);
} else if($fight->c1 != null && $fight->c2 == null) {
// C2 Is Bye
$this->assertEquals($parentFight->$toUpdate, $fight->c1);
}
$checkValue = null;
$cntNulls = (int)is_null($fight->c1) + (int)is_null($fight->c2);
if ($cntNulls === 1) {
$checkValue = is_null($fight->c1) ? $fight->c2 : $fight->c1;
}
$this->assertEquals($parentFight->$toUpdate, $checkValue);
Похоже когда $fight->c1
не null
хочешь пройти $fight->c1
, И когда $fight->c2
не null
хочешь пройти $fight->c2
, И когда оба null
ты хочешь пройти null
,
Что бы вы просто сделали,
$param = null;
if($fight->c1 != null)
{
$param = $fight->c1;
}
if($fight->c2 != null)
{
$param = $fight->c2;
}
$this->assertEquals($parentFight->$toUpdate, $param);
Но я бы сделал еще один шаг и описал бы $param
разрешить процесс, как,
private function relolveParam($fight) {
$param = null;
if($fight->c1 != null)
{
$param = $fight->c1;
}
if($fight->c2 != null)
{
$param = $fight->c2;
}
return $param;
}
Тогда вы только в конечном итоге,
$this->assertEquals($parentFight->$toUpdate, $this->relolveParam($fight));
использование else if
а не несколько if...else
if ($fight->c1 == null && $fight->c2 == null) {
// C1 and C2 Is Bye
$this->assertEquals($parentFight->$toUpdate, null);
} else if($fight->c1 == null && $fight->c2 != null) {
// C1 Is Bye
$this->assertEquals($parentFight->$toUpdate, $fight->c2);
} else if($fight->c1 != null && $fight->c2 == null) {
// C2 Is Bye
$this->assertEquals($parentFight->$toUpdate, $fight->c1);
} else {
// C1 and C2 Are all set
$this->assertEquals($parentFight->$toUpdate, null);
}
Вы можете использовать два if{}
вместо if{}else{}
как это,
if(a){
//do a
}else{
//do !a
}
if(a){
//do a
}
if(!a){
//do !a
}
Вы также можете сделать один тест для каждого из случаев, для которых вы тестируете, имея 4 четких теста вместо одного теста, когда неясно, как тестируются все пути.