如何测试每一行是否抛出相同的异常?

时间:2013-04-16 11:43:01

标签: php unit-testing phpunit

我想测试我的函数拒绝所有非正整数。它会抛出InvalidArgumentException。我写了一个这样的测试:

/**
 * @test
 * @expectedException InvalidArgumentException
 */
public function testXThrowsException()
{
    $this->parser->x(1.5);
    $this->parser->x('2');
    $this->parser->x(1000E-1);
    $this->parser->x(+100);
}

我的测试总是通过,因为第一个抛出异常。其他人没有得到适当的测试。我可以将$this->parser->x(1);添加到我的代码中,它仍会通过。

如何断言所有这些函数调用都会引发InvalidArgumentException?

3 个答案:

答案 0 :(得分:2)

/**
 * @test
 * @expectedException InvalidArgumentException
 *
 * @dataProvider foo
 */
public function testXThrowsException($value)
{
    $this->parser->x($value);
}

/**
 * Test data
 * Returns array of arrays, each inner array is used in
 * a call_user_func_array (or similar) construction
 */
public function foo()
{
    return array(
        array(1.5),
        array('2'),
        array(1000E-1),
        array(+100)
    );
}

答案 1 :(得分:1)

解决方案就是像这样使用它:

/**
 * @test
 */
public function testXThrowsException()
{
    try {
        $this->parser->x(1.5);
        $this->fail('message');
    } catch (InvalidArgumentException $e) {}
    try {
        $this->parser->x('2');
        $this->fail('message');
    } catch (InvalidArgumentException $e) {}
    try {
        $this->parser->x(1000E-1);
        $this->fail('message');
    } catch (InvalidArgumentException $e) {}
    try {
        $this->parser->x(+100);
        $this->fail('message');
    } catch (InvalidArgumentException $e) {}

}

现在您可以自行测试每一行。每当方法x() 引发异常时,使用fail()进行测试失败。

答案 2 :(得分:0)

如果您有很多负值,您也可以将它们放在一个数组中,并使用以下代码循环遍历数组(不进行测试):

foreach($wrongValueArray as $failtyValue) { 
  try { $this->parser->x($failtyValue); 
      this->fail($failtyValue . ' was correct while it should not'); 
  } catch (InvalidArgumentException $e) {} 
}

它有点短