在测试控制器时,我可以合法地实现100%的代码覆盖率,如下所示:
控制器代码
<?php
App::uses('AppController', 'Controller');
class UsersController extends AppController {
public function example($option = null) {
if ($option == 'foo') {
$some_var = 'hello';
} elseif ($option == 'bar') {
$some_var = 'goodbye';
}
$this->set(compact('option', 'some_var'));
}
}
测试代码
<?php
App::uses('UsersController', 'Controller');
class UsersControllerTest extends ControllerTestCase {
public function testExampleFoo() {
$this->testAction('/users/example/foo');
$this->assertEquals('hello', $this->vars['some_var']);
}
public function testExampleBar() {
$this->testAction('/users/example/bar');
$this->assertEquals('goodbye', $this->vars['some_var']);
}
}
但是,我怎样才能确定我的视图中达到了100%的代码覆盖率?例如:
控制器代码
<?php
App::uses('AppController', 'Controller');
class UsersController extends AppController {
public function example($option = null) {
$this->set('option', $option);
}
}
查看代码
<?php
if ($option == 'foo') {
$some_var = 'hello';
} elseif ($option == 'bar') {
$some_var = 'goodbye';
}
if (isset($some_var)) {
echo $some_var;
}
测试代码
<?php
App::uses('UsersController', 'Controller');
class UsersControllerTest extends ControllerTestCase {
public function testExampleFoo() {
$result = $this->testAction('/users/example/foo', array('return' => 'view'));
$this->assertEquals('hello', $result);
}
}
请注意,上述测试代码不会测试“/ users / example / bar”URL,因此从不测试视图的elseif
。因此,即使100%的控制器代码经过测试,我实际上还没有实现100%的代码覆盖率(因为不到100%的视图代码已经过测试)。我该怎么办?
答案 0 :(得分:2)
要回答标题CakePHP can use XDebug 中的问题,请提取测试的代码覆盖率。如果我没记错的话,它会将代码覆盖率渲染嵌入到测试套件中。
作为对上面给出的示例的一般性评论,恕我直言,我甚至会在没有选项传递时测试控制器的程度,以确保它以预期的方式响应,即使它抛出异常。 / p>
我很抱歉没有正确阅读@ Nick的问题。
据我所知,CakePHP没有提取.ctp
文件的代码覆盖率。这并不意味着XDebug不会生成它,你可以使用你的IDE(我使用具有tool的PhpStorm)或XDebug本身来直接撤回代码覆盖。当然,这并不像在CakePHP中单独使用测试套件那样顺利进行测试。
或者,您可以针对渲染视图进行测试。根据{{3}},可以在测试操作时指定返回类型。因此,一种可能的解决方案是将view
或contents
与预渲染文件进行比较。但是这有一个危险,因为任何不可见的字符('\n', '\r', '\t'
)都可能导致断言失败,即使逻辑上,目标和结果标记是相同的。
documentation中的一个示例显示了如何使用正则表达式来声明值,从而允许您检查文档的特定区域的有效性。您也可以使用PHP的documentation来遍历文档。
祝你好运! CakePHP的测试套件基于PHP单元,而PHP单元又使用XDebug生成代码覆盖。我查看了源代码并检查了BaseCoverageReport
类,发现为运行测试的任何框架文件生成了覆盖范围,包括被测单元(例如您的控制器)。这告诉我,代码覆盖率没有被选择性地打开,并且它是为包括视图模板在内的所有文件生成的。话虽如此,我没能找到模板作为其生成代码覆盖的文件之一。但是,我确实注意到没有为View
类生成代码覆盖,这意味着没有任何内容被渲染。在这一点上,我有点困惑,因为我会想象为了访问控制器测试用例的view
或contents
属性,必须呈现某些东西。经过仔细检查,结果证明这些值是空的,所以我的设置似乎可能出现问题。
我建议你做的是获得一个支持DOM classes调试的开源IDE,并在你的代码中加入一个断点并跟随线程通过框架。这将使您更深入地了解在测试控制器时如何呈现视图,如果是这样,将有助于跟踪代码覆盖率。我个人认为模板的代码覆盖非常有用,我很惊讶功能不存在。如果您确实选择修改框架的源代码,那么可能值得在GitHub中克隆CakePHP,然后添加一个拉取请求,以便它们可以将您的更改合并到主分支中。
对不起,我无法提供任何帮助,我尽了最大的努力!