2015-04-09 27 views
13

Tôi đang cố gắng viết một trường hợp thử nghiệm API cho một chức năng điều khiển bằng cách sử dụng codeception, và tôi đang gặp vấn đề khi tuyến đường đến chức năng bộ điều khiển không xuất hiện được đánh giá chính xác, và việc đánh giá có vẻ khác nhau tùy thuộc vào những gì tôi có trong trường hợp thử nghiệm của mình.Laravel 5/Codeception không định tuyến chính xác

Đây là một mẫu mã từ trường hợp thử nghiệm của tôi:

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); 
    } 

Tôi có một tập tin routes.php chứa các đường bay:

Route::get('/', ['as' => 'home', 'uses' => '[email protected]']); 
Route::get('register', ['as' => 'getRegister', 'uses' =>'[email protected]']); 
Route::post('register', ['as' => 'postRegister', 'uses' => '[email protected]']); 

Tôi đã chèn một số báo cáo debug vào các lớp điều khiển của tôi vì vậy để tôi có thể xem những tuyến đường nào chạy như sau:

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

Hiện tại tôi có tác dụng phụ ed xuống tất cả mọi thứ từ các lớp điều khiển của tôi để chỉ các câu lệnh debug được bao gồm.

Khi tôi chạy test như trên, tôi nhận được kết xuất debug sau:

GET register 
GET index 

... do đó, có vẻ như sendPOST ('đăng ký', ...) thực sự tuyến đường đến các tuyến đường GET cho "/" thay vì tuyến đường POST cho "/ đăng ký". Bên ngoài của trường hợp kiểm tra tất cả mọi thứ hoạt động bình thường - Tôi có thể POST để các tuyến đường đăng ký tốt, định tuyến xuất hiện để làm việc OK, vấn đề chỉ xuất hiện bên trong một trường hợp thử nghiệm codeception.

Nếu tôi thay đổi trường hợp thử nghiệm vì vậy mà tôi đang làm việc sendGET và sendPOST bên trong gọi chức năng tương tự, ví dụ như thế này:

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

sau đó tôi thấy debug đầu ra này:

GET register 
GET register 

... do đó bằng cách chèn sendGET vào cùng chức năng với sendPOST, nó đã thay đổi hành vi sendPOST để nó bây giờ định tuyến đến tuyến GET để đăng ký thay vì tuyến GET cho chỉ mục (nhưng vẫn chưa định tuyến đến đúng tuyến đường POST).

Tôi đã thử bật xdebug và không có bất kỳ manh mối nào từ đầu ra xdebug cũng như những gì đang xảy ra.

+0

Vấn đề chính xác của bạn là gì? –

Trả lời

6

Tôi nghĩ rằng tôi đã tìm thấy câu trả lời sau khi rất nhiều dòng lệnh gỡ lỗi (sử dụng phpstorm):

Các POST đăng ký chức năng xử lý tuyến đường trong bộ điều khiển được tuyên bố như thế này:

public function postRegister(RegistrationRequest $request) 
{ 

... yêu cầu một thể hiện Yêu cầu được chuyển vào thông qua việc tiêm phụ thuộc. Yêu cầu đó chứa một số mã xác nhận và nếu vì lý do nào đó mã xác thực không thể hoàn thành (ví dụ: ném ngoại lệ) thì hàm điều khiển sẽ không bao giờ được gọi - vì việc xây dựng yêu cầu không thành công.

Điều này, trong vùng đất trình duyệt, ném một lỗi 500 nhưng trong lĩnh vực codeception ngoại lệ bị mắc kẹt khác và nó trả về chuyển hướng đến/không có dữ liệu. Tất cả điều này xảy ra bên ngoài hàm điều khiển chứ không phải bên trong nó, do đó câu lệnh Log trong hàm điều khiển không bao giờ chạy vì hàm này không bao giờ được gọi. Các xử lý ngoại lệ trong codeception là một cái bẫy chung.

Đề xuất tiềm ẩn là có thể tiêm phụ thuộc vào bộ điều khiển là một ý tưởng tồi. Hoặc, có thể, các trình xử lý ngoại lệ chung đó là một ý tưởng tồi.

Các vấn đề liên quan