Laravel 5 / Codeception路由不正确

13

我正在使用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);
    }

我有一个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']);

我已经在我的控制器类中插入了一些调试语句,以便我可以看到运行的路由,就像这样:

    Log::debug('GET register');  // or GET index or POST register, etc

目前我已从控制器类中剥离了所有内容,只包含调试语句。

当我按照上述方式运行测试用例时,我会得到以下调试输出:

GET register
GET index

看起来,sendPOST('register', ...)实际上路由到了GET路由“/”而不是POST路由“/register”。除了测试用例以外,一切正常——我可以正常地提交POST到注册路由,路由似乎也工作正常,问题只在Codeception测试用例中出现。

如果我更改测试用例,使得我在同一个函数调用中进行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);
    }

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

GET register
GET register

通过将sendGET插入到与sendPOST相同的函数中,已更改sendPOST的行为,使其现在路由到注册页面的GET路径,而不是索引页面的GET路径(但仍无法路由到正确的POST路径)。

我已经尝试打开xdebug,并且从xdebug输出中也没有任何线索可以说明发生了什么。


你的问题是什么? - Gaurav Dave
1个回答

6

经过大量的命令行调试(使用phpstorm),我认为我找到了答案:

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

public function postRegister(RegistrationRequest $request)
{

需要通过依赖注入传递一个 Request 的实例。该请求包含一些验证代码,如果由于某种原因无法完成验证(例如抛出异常),则控制器函数将永远不会被调用 -- 因为构建请求失败了。
在浏览器中,这会导致500错误,但在 codeception 中,异常被捕获处理,并返回到没有数据的 / 重定向。所有这些都发生在控制器函数之外,而不是内部,因此控制器函数中的日志语句永远不会运行,因为该函数从未被调用。Codeception 中的异常处理程序是一个通用陷阱。
隐含的建议是,也许在控制器中使用依赖注入是个不好的主意。或者,也许,通用异常处理程序是个不好的主意。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接