我的 CalTest 类中的 Cal 类中有 div() 有以下方法来测试 div()。
public fucnction div($a,$b){
if($b == 0){
throw new Exception("Divided by zero");
}
return $a/$b
}
我只能通过 testDiv() 但 testDiv2()。
我想检查一下使用 PHPUnit 正确抛出的异常。我在这里想念什么?非常感谢您的帮助。谢谢!
您的第二张截图(有错误的截图)有
“@expectedException 异常”
而第三个有
@expectedException InvalidArgumentException
你真的仍然得到错误吗?你保存文件了吗?
为我工作:
<?php
class Foo
{
static function t()
{
throw new InvalidArgumentException('Hi there');
}
}
?>
<?php
require_once 'Foo.php';
class FooTest extends PHPUnit_Framework_TestCase
{
/**
* @expectedException InvalidArgumentException
*/
public function testT()
{
Foo::t();
}
}
?>
$ phpunit .
PHPUnit 3.6.10 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 5.25Mb
OK (1 test, 1 assertion)
刚刚遇到同样的问题。出于某种原因,PHPUnit 不允许您将 设置expectedException
为通用异常,我不知道为什么。就我个人而言,我选择抛出自定义异常代码,而不是每次我想区分异常时都必须创建一个新的异常类。
这是我解决它的方法:
/**
* @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 类,如果它是通用的,则将其重新包装为不同的异常;测试异常。
- 更新 -
昨天发现他们已经删除了当前“master”分支中的通用异常限制,这将是 3.7。显然,首席工程师不想修补 3.6。
此问题已在PHPUnit 3.7.x
您可以在 PHPUnit 3.7.x 中使用以下通用异常
/**
* @expectedException Exception
*/
你可以做这样的事情
编写单元测试,以便注入触发异常所需的值
//断言 $this->assertTrue($this->setExpectedException('PHPUnit_Framework_ExpectationFailedException'));
我创建了一个父类方法来做到这一点。事实上,这个类来自 laravel,但在任何情况下都是有效的。
这个方法最酷的部分是在 PHP 中使用匿名函数
<?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" ); }
);
}
}