繁体   English   中英

PHPUnit代码覆盖率和异常

[英]PHPUnit Code Coverage & Exceptions

我怀疑PHPUnit显示由于抛出了异常,所以单元测试未覆盖1行代码(但我抓住了)

我有应该覆盖那条线的单元测试

/**
 * @expectedException Doctrine\ORM\NoResultException
 */
public function testCannotLoginInvalidUser() {

  $user = User::login($this->em, 'nonExistant', 'password');
  $this->assertNull($user);

}

为什么我的代码覆盖率仍反映未覆盖的内容?

我做了一个测试...添加了回显b4返回null ...我发现该行确实未被覆盖...

try {
  $user = $query->getSingleResult();
} catch (Exception $e) {
  echo 'caught exception';  <-- this does not get executed. 
  return null;
}

一旦抛出异常,PHPUnit是否会跳过所有执行?

更新 :我感觉我在使用@expectedException错误...

您的代码示例只是冰山一角,很难确定确切的问题。

但是一个细节对我来说似乎很可疑:鉴于您的登录方法位于Application \\ Models中,因此以下代码

try {
  $user = $query->getSingleResult();
} catch (Exception $e) {

不会捕获任何异常,而是会捕获\\ Application \\ Models \\ Exception-如果您甚至定义了此类。

也许这就是您的异常处理程序无法运行的原因。

@expectedException Annotation类似于以下测试代码:

public function testDoStuff() {
    try { 
        doStuff();
    } catch(Exception $e) {
        // Test passed
        return;
    }
    $this->fail("Exception not thrown, test failed !");
}

因此,您不能(不应)在该测试用例中一次测试两件事。 (如果抛出异常并返回值)

如果您想测试User::login引发异常,则最好使用该测试用例,并且不需要断言(无论如何也不会执行该代码:))

get the red line covered您需要编写代码,以便$ query-> getSingleResult()引发异常。 这可能很棘手,但由于我没有看到足够多的源(例如查询对象来自何处),因此我在这里无法具体说明。

如果$ query对象是模拟对象,则让它在-> getSingleResult上引发异常,并编写测试用例以检查是否为“ null”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM