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()。
我想要检查使用PHPUnit正确抛出的exeption。 我在这里失踪了什么? 非常感谢您的帮助。 谢谢!
你的第二个截图(有错误的截图)有
"@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不允许您将
以下是我如何解决它:
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中使用以下通用异常
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'));