关于php:如何检查PHPUnit正确抛出的异常?

How to check the exception thrown correctly by PHPUnit?

我在CalTest类的Cal类中有div()有以下方法来测试div()。

1
2
3
4
5
6
public fucnction div($a,$b){
   if($b == 0){
    throw new Exception("Divided by zero");
   }
   return $a/$b
}

我只能传递testDiv()但是传递testDiv2()。

enter image description here

我想要检查使用PHPUnit正确抛出的exeption。 我在这里失踪了什么? 非常感谢您的帮助。 谢谢!

enter image description here


你的第二个截图(有错误的截图)有

"@expectedException Exception"

而第三个

@expectedException InvalidArgumentException

你还真的得到错误吗?你保存文件了吗?

适合我:

Foo.php

1
2
3
4
5
6
7
8
9
10
11
<?php

class Foo
{
    static function t()
    {
        throw new InvalidArgumentException('Hi there');
    }
}

?>

FooTest.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
require_once 'Foo.php';
class FooTest extends PHPUnit_Framework_TestCase
{
    /**
     * @expectedException InvalidArgumentException
     */

    public function testT()
    {
        Foo::t();
    }
}

?>

结果

1
2
3
4
5
6
7
8
$ phpunit .
PHPUnit 3.6.10 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 5.25Mb

OK (1 test, 1 assertion)


刚刚遇到同样的问题。由于某种原因,PHPUnit不允许您将expectedException设置为一般异常,我不知道为什么。我个人选择抛出自定义的异常代码,而不是每次我想区分异常时都要创建一个新的异常类。

以下是我如何解决它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * @expectedException Test_Exception
 */

public function testDivByZero()
{
    try {
        // Fyi you don't need to do an assert test here, as we are only testing the exception, so just make the call
        $result = $this->object->div(1,0);
    } catch (Exception $e) {
        if ('Exception' === get_class($e)) {
            throw new Test_Exception($e->getMessage(), $e->getCode());
        }
    }
 }

 // Test_Exception.php
 class Test_Exception extends Exception
 {
     public function __construct($message = null, $code = 0, Exception $previous = null)
     {
         parent::__construct($message, $code, $previous);
     }
 }

这将允许您按照自己的方式设计代码,并抛出"通用"异常。基本上它只测试Exception类,如果它是通用的,则将其重新包装为另一个异常; Test_Exception。

- 更新 -

昨天发现他们已经删除了当前"主"分支中的通用异常限制,该分支将为3.7。显然,首席工程师不想修补3.6。


此问题已在PHPUnit 3.7.x中修复

您可以在PHPUnit 3.7.x中使用以下通用异常

1
2
3
    /**
     * @expectedException Exception    
     */

它在PHPUnit抛出的异常中如此表示:

You must not except the generic exception class.

让您的类抛出更详细的异常,并进一步指定您在单元测试中期望的异常类型。


我创建了一个父类方法来完成它。事实上,这门课程来自laravel,但在任何情况下都有效。

这个方法很酷的部分是在PHP中使用匿名函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
class TestCase
         /* if you are not using laravel, you dont need this
        extends Illuminate\Foundation\Testing\TestCase */
{

    protected function assertThrows( $function , $classException ="/Exception" )
    {
        try
        {
            // Anonymous functions FTW
            $function();
        }
        catch( /Exception $objException )
        {
            // the assertInstanceOf should solve from here but
            // it is not working that great
            // @see http://stackoverflow.com/questions/16833923/phpunit-assertinstanceof-not-working
            if( $objException instanceof $classException ) {
                return $this->assertTrue( true );
            } else {
                // this will throw a error with a cool message
                return $this->assertEquals( $classException  , get_class( $objException ));
            }
        }
        // no exception happened.
        return $this->fail("Exception" . $classException ." expected." );
    }

}

class LanguageTest extends TestCase {

    /**
     * Test the translation
     *
     * @return void
     */

    public function testTranslation()
    {
        // this test may be ok
        $this->assertThrows(
            function(){ throw new Full\Path\Exception(":("); },
           "Full\Path\Exception" );

        // this test may fail
        $this->assertThrows(
            function(){ return 1 + 1; },
           "Some\Excepted\Exception" );

        // this test may work
        $this->assertThrows(
            function(){ throw new Exception("sad" ); }
        );
    }

}

你可以做这样的事情

编写单元测试,然后注入触发异常所需的值

//断言
$这 - > assertTrue($这 - > setExpectedException( 'PHPUnit_Framework_ExpectationFailedException'));