我正在尝试使用代码接收为 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/