PHPUnit在对象创建中测试断言

时间:2016-10-09 01:57:02

标签: php unit-testing phpunit

当我运行phpunit时,我得到:

  

1)FooTests :: testException assert():断言“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');
    }

}

1 个答案:

答案 0 :(得分:3)

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

1)抓住PHPUnit警告异常

PHP为每个失败的断言发出警告,因此PHPUnit会引发异常 类型为PHPUnit_Framework_Error_Warning。如doc

中所述
  

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

     

[..]

     

PHPUnit_Framework_Error_NoticePHPUnit_Framework_Error_Warning   分别代表PHP通知和警告。

所以你可以简单地抓住以下方式:

public function testException() {
    $this->expectException(\PHPUnit_Framework_Error_Warning::class);
    $this->foo->test();
}

2)在断言失败时使用回调

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

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,则可以使用名为assert.exception的新设置实现此最后一种行为:

public function test_using_assert_options_PHP7()
{
    $this->expectException(\AssertionError::class);
    assert_options(ASSERT_EXCEPTION, 1);
    $this->foo->test();
}

希望这个帮助