Unit testing cakephp 2.6控制器测试用例在重复testAction()上引发MissingActionException-调用

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

我希望任何人都能在我的测试环境方面帮助我

我的设置

我正在基于phpunit3.7.22和cake版本2.6.9实施单元测试。在Ubuntu12.04LTS上运行,带有PHP5.4.43-1和postgresql 9.1

我使用immplemented controller测试模拟身份验证组件,以便在会话中有一个用户,因为我的测试依赖于此。我的控制器返回json结果,因为它是基于JS的前端的API。我使用生成的控制器的testAction()调用调用我的控制器方法

<?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';