2

我想测试我的函数是否拒绝所有非正整数。它抛出一个 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?

4

3 回答 3

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)
    );
}
于 2013-04-16T12:01:16.800 回答
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().

于 2013-04-16T11:48:50.857 回答
0

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

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

它有点短

于 2013-04-16T12:03:34.333 回答