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

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

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

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

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

Я действительно думаю, что это плохая практика, однако вы можете обмануть 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'); } 

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

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

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

 There was 1 failure: 1) testExpectedToFail(ClassTest) I knew this would happen! 

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

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

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

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