Вы должны создать один тест на каждый возможный путь каждого метода/функции в приложении. В вашем примере есть два возможных случая для первого условного, когда $ Foo отличается от 3 и отличается от 5 и при $ Foo равно 3 или 5. Итак, сначала вы должны создать два случая испытаний:
<?php
class YourClassTest extends PHPUnit_Framework_Testcase
{
public function test_when_foo_is_different_to_three_or_five()
{
$this->assertEquals('expected result when foo is different from 3 or 5', myfunction(1));
}
public function test_when_foo_is_equal_to_three_or_five()
{
$expected = 'expected result when foo=3 or foo=5';
$this->assertEquals($expected, myfunction(3));
$this->assertEquals($expected, myfunction(5));
}
}
Теперь вы должны сделать то же самое для остальных условностей и перестановок. Однако вы сделали хорошее открытие, осознав, что метод myfunction() делает слишком много вещей, и его трудно проверить и понять, поэтому вы должны переместить все свои условные выражения на разные методы и протестировать их индивидуально, а затем использовать myfunciton(), чтобы вызвать их в желаемый заказ, если вам абсолютно необходимо. Рассмотрим следующий подход:
function myFunction($foo, $bar, $baz)
{
doSomethingWithFoo($foo);
doSomethingWithBar($bar);
doSomethingWithBaz($baz);
}
function doSomethingWithFoo($foo)
{
if (($foo != 3) AND ($foo != 5)) {
// something
}
}
function doSomethingWithBar($bar)
{
if (($bar < 1) OR ($bar > 10)) {
// something
}
}
function doSomethingWithBaz($baz)
{
if ((strlen($baz) === 0) OR (strlen($baz) > 10)) {
// something
}
}
Тестирование поможет вам с таким рефакторингом. Надеюсь, это поможет вам прояснить немного больше.