Laravel 5/Codeception无法正确路由

del*_*bel 13 php laravel codeception

我正在尝试使用代码编写一个控制器函数的API测试用例,我遇到的问题是,到控制器函数的路径似乎没有被正确评估,并且评估似乎根据我的不同而不同在我的测试用例中.

以下是我的测试用例中的代码示例:

use \ApiTester;

class CustomerRegisterCest
{
    // tests
    public function testGetRegister(ApiTester $I)
    {
        $I->sendGET('register');
        $I->seeResponseCodeIs(200);
    }

    public function testPostRegister(ApiTester $I)
    {
        $I->sendPOST('register', [
            // set the data in here
        ]);
        $I->seeResponseCodeIs(200);
    }
Run Code Online (Sandbox Code Playgroud)

我有一个包含这些路由的routes.php文件:

Route::get('/', ['as' => 'home', 'uses' => 'HomeController@getIndex']);
Route::get('register', ['as' => 'getRegister', 'uses' =>'RegistrationController@getRegister']);
Route::post('register', ['as' => 'postRegister', 'uses' => 'RegistrationController@postRegister']);
Run Code Online (Sandbox Code Playgroud)

我已经将一些调试语句插入到我的控制器类中,以便我可以看到运行的路由,如下所示:

    Log::debug('GET register');  // or GET index or POST register, etc
Run Code Online (Sandbox Code Playgroud)

目前我已经从控制器类中删除了所有内容,因此只包含调试语句.

当我像上面那样运行测试用例时,我得到以下调试输出:

GET register
GET index
Run Code Online (Sandbox Code Playgroud)

...所以似乎sendPOST('register',...)实际上路由到"/"的GET路由而不是"/ register"的POST路由.在测试用例之外一切正常 - 我可以POST到寄存器路由正常,路由似乎工作正常,问题只出现在一个代码测试案例中.

如果我更改测试用例,以便我在同一个函数调用中执行sendGET和sendPOST,例如:

    // tests
    public function testPostRegister(ApiTester $I)
    {
        $I->sendGET('register');
        $I->seeResponseCodeIs(200);
        $I->sendPOST('register', [
            // set the data in here
        ]);
        $I->seeResponseCodeIs(200);
    }
Run Code Online (Sandbox Code Playgroud)

然后我看到这个调试输出:

GET register
GET register
Run Code Online (Sandbox Code Playgroud)

...因此,通过将sendGET插入与sendPOST相同的函数,它已经改变了sendPOST行为,以便它现在路由到GET路由以进行寄存而不是GET路由索引(但仍然不会路由到正确的POST路线).

我已经尝试打开xdebug并且没有任何来自xdebug输出的线索关于发生了什么.

del*_*bel 6

我想在经过大量命令行调试(使用phpstorm)之后我找到了答案:

控制器中的POST寄存器路由处理函数声明如下:

public function postRegister(RegistrationRequest $request)
{
Run Code Online (Sandbox Code Playgroud)

...要求通过依赖注入传递Request实例.该请求包含一些验证代码,如果由于某种原因验证代码无法完成(例如抛出异常),则控制器函数永远不会被调用 - 因为构建请求失败.

在浏览器中,这会抛出500错误,但在代码识别中,异常被捕获不同,并且它返回重定向到/没有数据.这一切都发生在控制器函数之外而不是在其内部,因此控制器函数中的Log语句永远不会运行,因为函数永远不会被调用.代码中的异常处理程序是一个通用陷阱.

隐含的建议是,控制器中的依赖注入可能是个坏主意.或者,也许,通用异常处理程序是一个坏主意.