Тестовое утверждение PHPUnit при создании объекта

#php #unit-testing #phpunit

#php #модульное тестирование #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. поведение связано с исключением, возникающим из phpunit типа: PHPUnit_Framework_Error_Warning какую версию php вы используете?

Ответ №1:

Вы можете достичь одним из следующих способов:

1) Перехватить исключение с предупреждением PHPUnit

PHP выдает предупреждение для каждого неудачного утверждения, поэтому PHPUnit создает исключение типа PHPUnit_Framework_Error_Warning . Как описано в документе:

По умолчанию PHPUnit преобразует ошибки, предупреждения и уведомления PHP, которые запускаются во время выполнения теста, в исключение.

[..]

PHPUnit_Framework_Error_Notice и PHPUnit_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();
}
  

Надеюсь, это поможет

Комментарии:

1. Спасибо, Маттео, этот ответ идеален. Третий вариант сработал как шарм!