#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. Спасибо, Маттео, этот ответ идеален. Третий вариант сработал как шарм!