对象创建中的PHPUnit测试断言

对象创建中的PHPUnit测试断言,php,unit-testing,phpunit,Php,Unit Testing,Phpunit,当我运行phpunit时,我得到: 1) FootTests::testException断言():断言“false”失败 我希望在我的案例中得到断言 class FooTests extends WP_UnitTestCase { protected $foo; public function setUp() { parent::setUp(); $this->foo = new Foo(); } function tes

当我运行phpunit时,我得到:

1) FootTests::testException断言():断言“false”失败

我希望在我的案例中得到断言

class FooTests extends WP_UnitTestCase {

  protected $foo;

    public function setUp() {
        parent::setUp();
        $this->foo = new Foo();
    }

    function testException() {
        // I'd like to expect an assert in the class foo so the test should not fail.  
        $this->foo->test();
    }
}

class Foo {
    public function __construct(){
    }

    public function __destruct(){}


    public function test(){
      assert('false');
    }

}

您可以通过以下方式之一实现:

public function testException() {
    $this->expectException(\PHPUnit_Framework_Error_Warning::class);
    $this->foo->test();
}
1)捕获PHPUnit警告异常

PHP会为每个失败的断言发出警告,因此PHPUnit不会引发异常 类型为
PHPUnit\u Framework\u Error\u Warning
。如以下文件所述:

默认情况下,PHPUnit会转换以下PHP错误、警告和通知: 在执行异常测试期间触发

[……]

PHPUnit\u Framework\u Error\u Notice
PHPUnit\u Framework\u Error\u Warning
分别表示PHP通知和警告

因此,您可以通过以下方式简单捕获:

public function testException() {
    $this->expectException(\PHPUnit_Framework_Error_Warning::class);
    $this->foo->test();
}
2)对失败的断言使用回调

您可以使用回调做一些更清楚的事情,将其用作自定义异常,并将其作为示例进行处理:

public function test_using_assert_options_PHP5()
{
    $fnc = function() {
        throw new \Exception('assertion failed', 500);
    };

    $this->expectException(\Exception::class);
    $this->expectExceptionCode(500);
    $this->expectExceptionMessage('assertion failed');

    assert_options(ASSERT_CALLBACK, $fnc);
    $this->foo->test();
}
3)更改失败异常的行为(仅从PHP7开始)

如果您使用的是PHP7,您可以通过一个名为:


希望此帮助

此行为是由phpunit引发的异常引起的:
phpunit\u Framework\u Error\u Warning
您使用的是哪个版本的php?谢谢Matteo,这个答案很完美。第三种选择很有魅力!