我想要通过测试得到以下内容:“此测试没有执行任何断言”
我知道我可以添加类似assertTrue(true)的内容但是是否可以在配置中添加一些东西以使这些测试通过?
我很确定这只发生在自版本PHPUnit 3.5.0以及引入之后 --strict
答案 0 :(得分:7)
使用@doesNotPerformAssertions
annotation:
/**
* @doesNotPerformAssertions
*/
public function testCodeWithoutUsingAssertions()
{
// do stuff...
}
答案 1 :(得分:6)
利用$this->addToAssertionCount(1)
。见下文。
class NoAssertTest extends PHPUnit_Framework_TestCase
{
function testWithoutAssertions() {
$x = 5;
// Increment the assertion count to signal this test passed.
// This is important if you use a @depends on this test
$this->addToAssertionCount(1);
}
}
答案 2 :(得分:2)
如果你有PHP SimpleTest,另一种方法是使用:
$this->pass();
这将标记测试已完成并通过。
另一方面,对于您想要失败的测试,您可以使用:
$this->fail();
例如:
if (someComplicatedLogicValidation) {
// Do more stuff and asserts
} else{
$this->fail();
}
我在PHP 5.5中试过这个并且可以工作:
function testThatWorks() {
$this->pass();
}
function testThatFails() {
$this->fail();
}
输出:
1)在[... ExampleTest.unit.php第23行]失败 在testThatFails中 在ExampleTest中 in ... / ExampleTest.unit.php 在3.02s中失败
也许方法传递仍然可以在PHPUnit中轻松实现。 SimpleTest的来源:
function pass($message = "Pass") {
if (! isset($this->reporter)) {
trigger_error('Can only make assertions within test methods');
}
$this->reporter->paintPass(
$message . $this->getAssertionLine());
return true;
}
答案 3 :(得分:1)
使用PHPUnit 7.2,您可以获得另一个选择:
public function testCodeWithoutUsingAssertions()
{
$this->expectNotToPerformAssertions();
// do stuff...
}
答案 4 :(得分:0)
就我而言,该测试没有断言,因为我只是使用prophecy
lib进行模拟检查所有内容,并检查方法是否按预期方式被调用...
PHPUnit默认情况下期望测试至少具有一个断言,并警告您放置它。
只需在测试的任何部分中添加此行即可。
$this->expectNotToPerformAssertions();
但是您也可以设计一个在某些情况下是否具有断言的测试
public function testCodeNoAssertions()
{
if ($something === true) {
$this->expectNotToPerformAssertions();
}
// do stuff...
if ($somethingElse === true) {
//do any assertion
}
}
总而言之,这不是错误,而是功能。
答案 5 :(得分:0)
PHPUnit 7.2及更高版本。如果有条件,可以使用 $ this-> expectNotToPerformAssertions(),这可能会禁用断言。似乎它不在官方文档中,但可以在这里找到:https://github.com/sebastianbergmann/phpunit/pull/3042/files
public function testCodeNoAssertions()
{
$this->expectNotToPerformAssertions();
}
至少PHPUnit 7.0以上。可以使用 @doesNotPerformAssertions 。当前文档未说明添加时间。 https://phpunit.readthedocs.io/en/7.0/annotations.html#doesnotperformassertions
/**
* @doesNotPerformAssertions
*/
public function testCodeWithoutUsingAssertions()
{
}
如果您的测试只是不完整,则应该使用 $ this-> markTestIncomplete() https://phpunit.readthedocs.io/en/7.0/incomplete-and-skipped-tests.html
public function testCodeThatIsIncomplete()
{
$this->markTestIncomplete('Implementation of this test is not complete.');
}
如果要暂时禁用测试,请使用 $ this-> markTestSkipped()。 https://phpunit.readthedocs.io/en/7.0/incomplete-and-skipped-tests.html#skipping-tests
public function testCodeThatIsDisabledTemporarily()
{
$this->markTestSkipped('This test is disabled to test, if it is interfering with other tests.');
}
答案 6 :(得分:0)
我创建了一个超类并在那里放置了类似 SimpleTest 的函数:
/**
* Pass a test
*/
public function pass()
{
//phpunit is missing pass()
$this->assertTrue(true);
}
然后就可以调用了
$this->pass();
答案 7 :(得分:-1)
以下测试通过PHPUnit 3.5.13传递给我。
class NoAssertTest extends PHPUnit_Framework_TestCase
{
function testWithoutAssertions() {
$x = 5;
}
}
您可以发布您的代码,以便我们自己查看吗?将其编辑为仍然失败的最简单代码。
编辑:如果您将--strict
传递给PHPUnit,请不要。此选项的要点是“如果没有断言,则将测试标记为不完整。”