【问题标题】:PHPUnit test passes when it should failPHPUnit 测试在它应该失败时通过
【发布时间】:2014-07-24 22:28:04
【问题描述】:

我正在编写一个 PHPUnit 测试套件,但遇到了一些问题。

这是测试:

public function testSomething(){
  $stub = $this->getMockForAbstractClass('\core\classes\ImportedFile');

  $stub->expects($this->exactly(4))
       ->method('thismethoddoesntexist');

  $this->markTestIncomplete('not finished implementing');
}

由于某种原因,此测试没有失败。应该是因为该方法不存在,因此甚至没有被调用一次,更不用说4次了。我在其中放了什么并不重要,即使我放了一个确实存在的方法名称并说我希望它运行 100,000 次,但当这显然是错误的时候它仍然会通过。

我觉得这很奇怪,因为我在以前的测试中进行了类似的检查,并且可以正常工作。

有没有其他人遇到过这样的问题?

【问题讨论】:

  • 我没有看到您实际上是在调用任何方法或断言任何东西......您正在设定期望,但您的测试没有做任何事情。
  • 是的,测试只是写到一半——我显然会在其中添加一些方法调用等。不过,我仍然认为这应该是测试失败,因为我希望调用一个方法,但事实并非如此。
  • markTestIncomplete 旨在防止您的测试失败。它没有通过,但您的测试套件会说所有测试都通过了。 phpunit.de/manual/current/en/…
  • @Schleis 我认为有一些不一致之处 - 如果我创建一个仅包含 $this->assertTrue(false) 的测试,然后调用 markTestIncomplete,PHPUnit 正确地无法通过测试。那么为什么在我上面的例子中不这样做呢?
  • 因为失败的断言被一个异常标记,该异常阻止了对 markTestIncomplete 的调用。在您的情况下,模拟检查是在测试完成后进行的。所以markTestIncomplete 被调用并且测试被标记为未完成。

标签: php unit-testing phpunit


【解决方案1】:

markTestIncomplete 抛出特殊异常,结束测试。跳过对模拟中的“期望”的检查。

public static function markTestIncomplete($message = '')
    {
        throw new PHPUnit_Framework_IncompleteTestError($message);
    }

【讨论】:

    【解决方案2】:

    找到问题的原因。这似乎是由对$this->markTestIncomplete() 的调用引起的。出于某种原因,在测试中使用它会导致它不会失败,至少在这种情况下,即使它应该失败。

    删除对markTestIncomplete 的调用使其行为正常并在应该时失败。我倾向于将 markTestIncomplete 方法留在测试中,直到它 100% 完成,并假设如果我运行测试,即使在其不完整的状态下,如果没有满足预期,它也会失败。这不是一个公平的假设吗?这是 PHPUnit 中的错误吗?

    【讨论】:

    • 我使用Mockery 进行测试,所以我的体验有点不同,但Mockery 需要在测试运行后调用Mockery::close() 以正确解决方法调用期望。也许需要类似的东西?
    • 感谢您的评论 - 我不知道 PHPUnit 中有类似的东西。我会做一些谷歌搜索。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多