1

I am new to using PHPUnit, I found out that it is easy to test if given value is desired one using assertEquals function but I am not sure how to test for values with more than one condition such as:

function myFunction($foo, $bar, $baz)      
{
    if (($foo != 3) AND ($foo != 5)) {
       // something
    }

    if (($bar < 1) OR ($bar > 10)) {
      // something
    }

    if ( (strlen($baz) === 0) OR (strlen($baz) > 10) ) {
      // something
    }
}

Can anyone help on how to write unit test for these conditions please ? Thanks for your help in advance

4

2 回答 2

7

您应该为应用程序中每个方法/函数的每个可能路径创建一个测试用例。在您的示例中,第一个条件有两种可能的情况,当 $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
    }
}

测试将在这种重构方面为您提供很多帮助。希望这可以帮助您澄清更多。

于 2013-06-23T18:24:19.803 回答
5

看一下assertThat方法。

于 2013-06-22T23:02:57.307 回答