Как поймать предупреждение PHP в PHPUnit - PullRequest
17 голосов
/ 20 февраля 2011

Я пишу контрольные примеры, и вот у меня есть вопрос.

Допустим, я тестирую простую функцию someClass::loadValue($value)

Обычный тестовый случай прост, но предположим, что при передаче значения null или -1 вызов функции генерирует предупреждение PHP, которое считаетсяошибка.

Вопрос в том, как мне написать тестовый пример PHPUnit, чтобы он успешно выполнялся, когда функции корректно обрабатывали ноль / -1, и не выполнялся, когда выдается предупреждение PHP?

Спасибо,

Ответы [ 5 ]

36 голосов
/ 20 февраля 2011

PHPUnit_Util_ErrorHandler::handleError() выдает один из нескольких типов исключений на основе кода ошибки:

  • PHPUnit_Framework_Error_Notice для E_NOTICE, E_USER_NOTICE и E_STRICT
  • PHPUnit_Framework_Error_Warning для E_WARNING и E_USER_WARNING
  • PHPUnit_Framework_Error для всех остальных

Вы можете поймать и ожидать их, как и любое другое исключение.

/**
 * @expectedException PHPUnit_Framework_Error_Warning
 */
function testNegativeNumberTriggersWarning() {
    $fixture = new someClass;
    $fixture->loadValue(-1);
}
7 голосов
/ 13 октября 2017

Я бы создал отдельный случай для проверки, когда ожидается уведомление / предупреждение.

Для PHPUnit v6.0 + это современный синтаксис:

use PHPUnit\Framework\Error\Notice;
use PHPUnit\Framework\Error\Warning;
use PHPUnit\Framework\TestCase;

class YourShinyNoticeTest extends TestCase
{

    public function test_it_emits_a_warning()
    {
        $this->expectException(Warning::class);

        file_get_contents('/nonexistent_file'); // This will emit a PHP Warning, so test passes
    }


    public function test_it_emits_a_notice()
    {
        $this->expectException(Notice::class);

        $now = new \DateTime();
        $now->whatever; // Notice gets emitted here, so the test will pass
    }
}
7 голосов
/ 15 ноября 2012

Для меня сработало изменение моего phpunit.xml, чтобы иметь

<phpunit
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         strict="true"
         >
</phpunit>

Ключ должен был использовать strict="true" для получения предупреждений, приводящих к неудачному тесту.

3 голосов
/ 31 августа 2011

Вы также можете написать файл phpunit.xml (в каталоге ваших тестов) с помощью:

<phpunit 
convertErrorsToExceptions="true" 
convertNoticesToExceptions="false" 
stopOnFailure="false">
</phpunit>
0 голосов
/ 20 февраля 2011

Заставьте SomeClass выдать ошибку, если ввод неверен, и скажите phpUnit ожидать ошибку.

Один из методов такой:

class ExceptionTest extends PHPUnit_Framework_TestCase
{
    public function testLoadValueWithNull()
    {
        $o = new SomeClass();            
        $this->setExpectedException('InvalidArgumentException');
        $this->assertInstanceOf('InvalidArgumentException', $o::loadValue(null));
    }
}

См. документацию для дополнительных методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...