Unit testing cakephp 2.6控制器测试用例在重复testAction()上引发MissingActionException-调用
我希望任何人都能在我的测试环境方面帮助我 我的设置 我正在基于phpunit3.7.22和cake版本2.6.9实施单元测试。在Ubuntu12.04LTS上运行,带有PHP5.4.43-1和postgresql 9.1 我使用immplemented controller测试模拟身份验证组件,以便在会话中有一个用户,因为我的测试依赖于此。我的控制器返回json结果,因为它是基于JS的前端的API。我使用生成的控制器的testAction()调用调用我的控制器方法Unit testing cakephp 2.6控制器测试用例在重复testAction()上引发MissingActionException-调用,unit-testing,cakephp,exception,controller,phpunit,Unit Testing,Cakephp,Exception,Controller,Phpunit,我希望任何人都能在我的测试环境方面帮助我 我的设置 我正在基于phpunit3.7.22和cake版本2.6.9实施单元测试。在Ubuntu12.04LTS上运行,带有PHP5.4.43-1和postgresql 9.1 我使用immplemented controller测试模拟身份验证组件,以便在会话中有一个用户,因为我的测试依赖于此。我的控制器返回json结果,因为它是基于JS的前端的API。我使用生成的控制器的testAction()调用调用我的控制器方法 <?php App::u
<?php
App::uses('RequesttypesController', 'Svc.Controller');
class RequesttypesWithResultControllerTest extends ControllerTestCase
{
public $fixtures = array(
'app.requesttype',
'app.user',
'app.privilege',
'app.groupsprivilege',
'app.groupsuser',
'app.groupscompany',
'app.company',
);
/**
* Mock the requesttype object so that it can return results depending on the desired outcome
*
* @see CakeTestCase::setUp()
*/
public function setUp()
{
parent::setUp();
$this->controller = $this->generate('Svc.Requesttypes', array(
'models' => array(
'Requesttype'
),
'components' => array(
'Auth' => array(
'user'
),
'Session',
'RequestHandler'
)
));
$this->controller->Auth->staticExpects($this->any())
->method('user')
->will($this->returnValue(array(
'id' => 123,
'username' => 'myTestUser',
'company' => 'myTestCompany',
'usertype_id' => '456',
))
);
$authResult = $this->controller->Auth->user();
}
public function tearDown()
{
parent::tearDown();
unset($this->controller);
}
/**
* A logged in user produces a number of requesttypes
*/
public function testLoggedInUser()
{
$result = $this->testAction('/svc/requesttypes/getMyRequesttypes', array('return' => 'vars'));
$this->assertNotEmpty($this->vars, 'Did not receive webservice response');
$this->assertTrue(isset($this->vars['data']['code']), 'Received invalid webservice response');
$this->assertEqual($this->vars['data']['code'], SvcAppController::RESPONSE_CODE_SUCCESS);
}
}
?>
testAction似乎调用了一个空的控制器操作,即使操作url作为参数传递。我试图通过将控制器置零并再次调用$this->generate()来重新初始化控制器,但这也没有帮助
当然,我可以通过为每个测试创建一个自己的测试控制器来帮助自己,每个测试都以一堆重复的测试代码结束,但这对我来说似乎不太合适
我是否误用了测试环境,或者如何解释这个异常?有什么想法吗
提前谢谢你分享我的头痛 经过进一步的代码调试,我们终于找到了错误。我们意外地将/Config/routes.php文件最后一行的require语句更改为require_once,因为测试环境中抛出了一些“类已定义的异常” 错误的路由。php:
require_once CAKE . 'Config' . DS . 'routes.php';
require CAKE . 'Config' . DS . 'routes.php';
对于没有区别的应用程序本身,因为每个请求只需要初始化一次路由。但是在测试环境中,路由会被重新初始化几次,这在require_once include中是不可能的
这是该行的默认外观:
正确的路由。php:
require_once CAKE . 'Config' . DS . 'routes.php';
require CAKE . 'Config' . DS . 'routes.php';
经过进一步的代码调试,我们终于发现了错误。我们意外地将/Config/routes.php文件最后一行的require语句更改为require_once,因为测试环境中抛出了一些“类已定义的异常” 错误的路由。php:
require_once CAKE . 'Config' . DS . 'routes.php';
require CAKE . 'Config' . DS . 'routes.php';
对于没有区别的应用程序本身,因为每个请求只需要初始化一次路由。但是在测试环境中,路由会被重新初始化几次,这在require_once include中是不可能的
这是该行的默认外观:
正确的路由。php:
require_once CAKE . 'Config' . DS . 'routes.php';
require CAKE . 'Config' . DS . 'routes.php';