php - Laravel 5/Codeception 未正确路由

标签 php laravel codeception

我正在尝试使用代码接收为 Controller 函数编写 API 测试用例,但遇到了一个问题,即 Controller 函数的路由似乎未正确评估,并且评估似乎有所不同,具体取决于关于我的测试用例中的内容。

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

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']);

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

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

目前,我已经从 Controller 类中剥离了所有内容,以便仅包含调试语句。

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

GET register
GET index

...所以看起来 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);
    }

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

GET register
GET register

...因此,通过将 sendGET 插入与 sendPOST 相同的函数中,它更改了 sendPOST 行为,以便它现在路由到注册的 GET 路由,而不是索引的 GET 路由(但仍然不会路由到正确的 POST 路由)。

我尝试打开 xdebug,但从 xdebug 输出中没有任何关于发生了什么的线索。

最佳答案

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

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

public function postRegister(RegistrationRequest $request)
{

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

这在浏览器领域会引发 500 错误,但在代码接收领域,异常的捕获方式有所不同,并且它返回重定向到/且没有数据。这一切都发生在 Controller 函数之外而不是在 Controller 函数内部,因此 Controller 函数中的 Log 语句永远不会运行,因为该函数永远不会被调用。 Codeception 中的异常处理程序是一个通用陷阱。

隐含的建议是 Controller 中的依赖注入(inject)可能是一个坏主意。或者,也许通用异常处理程序是一个坏主意。

关于php - Laravel 5/Codeception 未正确路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29529440/

相关文章:

laravel - Codeception seeInDatabase() 对我不起作用

testing - 强制在另一个之前运行代码接受测试

javascript - 在选择更改事件时通过 jquery 提交表单

PHP MySQL数据库问题

php - 使用 Active Record 和 GroceryCrud 在 CodeIgniter 中加入表

php - 使用 Laravel Validation 验证 UUID

php - varchar 日期未在 mysql 查询中选择

Laravel 和 MySQL 在 DateTime 方面表现不佳

reactjs - Laravel 中的 react 路由器

php - 使用代码接收从链接中仅提取数字