[英]Laravel 5 / Codeception not routing correctly
我正在嘗試使用代碼編寫一個控制器函數的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路由而不是“/ 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)之后我找到了答案:
控制器中的POST寄存器路由處理函數聲明如下:
public function postRegister(RegistrationRequest $request)
{
...要求通過依賴注入傳遞Request實例。 該請求包含一些驗證代碼,如果由於某種原因驗證代碼無法完成(例如拋出異常),則控制器函數永遠不會被調用 - 因為構建請求失敗。
在瀏覽器中,這會拋出500錯誤,但在代碼識別中,異常被捕獲不同,並且它返回重定向到/沒有數據。 這一切都發生在控制器函數之外而不是在其內部,因此控制器函數中的Log語句永遠不會運行,因為函數永遠不會被調用。 代碼中的異常處理程序是一個通用陷阱。
隱含的建議是,控制器中的依賴注入可能是個壞主意。 或者,也許,通用異常處理程序是一個壞主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.