【发布时间】:2013-05-04 04:12:43
【问题描述】:
在测试控制器时,我可以合法地实现 100% 的代码覆盖率,如下所示:
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% 的代码覆盖率?例如:
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%)。我该怎么办?
【问题讨论】:
-
还请记住,这些是单元测试。您的控制器测试
estExampleFoo()旨在为仅UsersController::example()方法本身提供覆盖,不 您的.ctp 文件。正如 Sam 所暗示的那样,测试您的 ctps 通常更多地属于“集成”测试的标题。由于您提到的原因,在您的视图中放置分支和逻辑在测试环境中通常是一个坏主意。相反,创建使用您的视图变量的助手并确定应该显示的内容。这样你的 Helper 就可以很容易地自行测试了。
标签: cakephp testing code-coverage