Как указать, что ожидается, что тест PHPUnit завершится неудачей?

Можно ли пометить тест как "ожидаемый сбой" с помощью PHPUnit? Это было бы полезно при выполнении TDD, и вы хотите различать действительно неудачные тесты и тесты, которые не выполняются, потому что связанный код еще не написан.

Ответы

Ответ 1

Я думаю, что в этих случаях он достаточно стандартный, чтобы просто пометить тест как пропущенный. Ваши тесты все равно будут выполняться, и пакет будет проходить, но тестовый бегун предупредит вас о пропущенных тестах.

http://phpunit.de/manual/current/en/incomplete-and-skipped-tests.html

Ответ 2

"Правильный" способ обращения с этим - использовать $this->markTestIncomplete(). Это будет означать, что тест является неполным. Он вернется, как переданный, но отобразит сообщение. Подробнее см. http://www.phpunit.de/manual/3.0/en/incomplete-and-skipped-tests.html.

Ответ 3

Я действительно считаю это плохой практикой, однако вы можете обмануть PHPUnit таким образом:

/**
 * This test will succeed !!!
 * @expectedException PHPUnit_Framework_ExpectationFailedException
 */
public function testSucceed()
{
    $this->assertTrue(false);
}

Более чисто:

  public function testFailingTest() {  
    try {  
      $this->assertTrue(false);  
    } catch (PHPUnit_Framework_ExpectationFailedException $ex) {  
      // As expected the assertion failed, silently return  
      return;  
    }  
    // The assertion did not fail, make the test fail  
    $this->fail('This test did not fail as expected');  
  }

Ответ 4

Если вы хотите, чтобы тест был неудачным, но знаете, что его отказ ожидался, вы можете добавить сообщение к утверждению, которое будет выводиться в результаты:

public function testExpectedToFail()
{    
    $this->assertTrue(FALSE, 'I knew this would happen!');
}

В результатах:

There was 1 failure:

1) testExpectedToFail(ClassTest)
I knew this would happen!

Ответ 5

Комментарий на шестьдесят девять выше почти идеально подходит для того, что я искал.

Метод fail() полезен, когда вы устанавливаете тест для ожидаемого исключения и если он не инициирует исключение, которое вы хотите, чтобы тест завершился с ошибкой.

$this->object->triggerException();
$this->fail('The above statement was expected to trigger and exception.');

Конечно, triggerException заменяется чем-то в вашем объекте.

Ответ 6

В PHPUnit 8.2.5 вы можете просто ожидать исключения брошенного утверждения:

$this->expectException('PHPUnit\Framework\ExpectationFailedException');
$this->assertTrue(false);