【问题标题】:PHPUnit how to test for two conditionsPHPUnit如何测试两个条件
【发布时间】:2013-06-22 22:52:08
【问题描述】:

我是使用 PHPUnit 的新手,我发现使用 assertEquals 函数很容易测试给定值是否需要,但我不确定如何测试具有多个条件的值,例如:

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
    }
}

任何人都可以帮助如何为这些条件编写单元测试吗? 提前感谢您的帮助

【问题讨论】:

    标签: php unit-testing phpunit


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      看看assertThat方法。

      【讨论】:

        猜你喜欢
        • 2018-08-28
        • 1970-01-01
        • 2023-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-21
        • 2015-10-31
        • 2012-11-02
        相关资源
        最近更新 更多