4

我只是在学习单元测试。这个php代码

class Foo {
    public function bar($arg) {
        throw new InvalidArgumentException();
    }
}

...

class FooTest extends PHPUnit_Framework_TestCase {
    public function testBar() {
        $this->setExpectedException('InvalidArgumentException');
        $dummy = Foo::bar();
    }
}

Failed asserting that exception of type "PHPUnit_Framework_Error_Warning" matches expected exception "InvalidArgumentException".从 phpunit失败。如果在测试中放置了任何值,Foo::bar()那么它当然会按预期工作。有没有办法测试空参数?还是我错误地尝试为不应该在单元测试范围内的东西创建测试?

4

2 回答 2

6

你不应该测试这种情况。单元测试的目的是确保被测类根据其“契约”执行,这是它的公共接口(函数和属性)。你试图做的是打破合同。正如您所说,它超出了单元测试的范围。

于 2012-09-18T09:37:54.820 回答
2

我同意合同测试中的“yegor256”。然而,有时我们有可选的参数来使用先前声明的值,但如果它们没有设置,那么我们就会抛出异常。下面显示了您的代码的略微修改版本(简单示例,不好或生产就绪)和测试。

class Foo {
    ...
    public function bar($arg = NULL)
    {
        if(is_null($arg)        // Use internal setting, or ...
        {
                  if( ! $this->GetDefault($arg)) // Use Internal argument
                  {
                       throw new InvalidArgumentException();
                  }
        }
        else
        {
            return $arg;
        }
    }
}

...
class FooTest extends PHPUnit_Framework_TestCase {
    /**
     * @expectedException InvalidArgumentException
     */
    public function testBar() {
        $dummy = Foo::bar();
    }

    public function testBarWithArg() {
        $this->assertEquals(1, Foo:bar(1));
    }
}
于 2012-09-18T16:58:38.903 回答