2015-11-02 110 views
4

我是新來的Codeception,我試圖測試我使用Laravel 5構建的Web服務。我遵循指南here如何使用Codeception測試laravel 5 API?

因此,我創建了一套名爲API第一:

codecept generate:suite api 

api.suite.yml

class_name: ApiTester 
modules: 
    enabled: 
     - REST: 
      url: http://localhost:8000/api/ 
      depends: Laravel5 

AuthenticateUserCept.php

<?php 
$I = new ApiTester($scenario); 
$I->wantTo('authenticate a user'); 
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded'); 
$I->sendPOST('/authenticate', [ 
    'username' => 'archive', 
    'email' => '[email protected]', 
    'password' => 'password' 
]); 
$I->seeResponseCodeIs(200); 
$I->seeResponseIsJson(); 

我已經嘗試這使用Post男人,它運行良好。 /authenticate路由採用3個參數並高興地吐出一個JWT令牌,但我無法使其與Codeception一起工作。

1) Failed to authenticate a user in AuthenticateUserCept (tests/api//AuthenticateUserCept.php) 

Step I see response code is 200 
Fail Failed asserting that 500 matches expected 200. 

Scenario Steps: 

3. $I->seeResponseCodeIs(200) 
2. $I->sendPOST("/authenticate",{"username":"archive","email":"[email protected]","password":"password"}) 
1. $I->haveHttpHeader("Content-Type","application/x-www-form-urlencoded") 

我在哪裏出錯了?此外,對於我來說,我如何重構這個特定的測試,以便爲我提出的其他請求建立JWT。任何幫助表示讚賞。

在api.suite.yml

class_name: ApiTester 
modules: 
    enabled: 
     - REST: 
      url: http://localhost:8000/api/ 
      depends: Laravel5 
    config: 
     Laravel5: 
      environment_file: .env.testing 

回答

0

編輯更改之前我的回答是,一些評論:

    在api.suite.yml啓用線
  • 我包括:啓用: PhpBrowser,REST,ApiHelper,Asserts]。
  • REST行中的網址對API套件沒有任何影響,它通常只用於接受套件。這應該是通過路徑直接進入你的代碼,而不是使用phpbrowser模式或類似的地方進行HTTP調用。
  • 而不是使用PhpBrowser模式,您可以使用Laravel5模式 - 前者將通過中間件發送請求,如果APP_ENV設置爲測試,則Laravel5模式不會通過中間件發出請求。

就如何解決這個問題而言,我會先試着弄清楚代碼是如何去做500錯誤的。你可能要做的一件事就是嘗試在代碼中插入一些調試/日誌行。另一件事是把這樣一行寫入測試用例中:

$ I-> seeResponseContains('blablabla');

當然,這將失敗,但它會在tests/_output目錄中產生一個輸出,以便您可以確切地看到代碼給出的迴應以及500錯誤(當然,您需要先執行此操作測試200條件,否則你的測試將在該步驟中退出)。

測試用例中這種類型的錯誤的一個常見原因是驗證應用於傳遞到您的控制器方法的自定義Request類。如果驗證失敗,那麼控制器方法不會被擊中,您將得到一個500錯誤而不能在控制器中進行調試。我認爲這種自定義請求類是一個壞主意。

另一個可能的調查方法是構建一個測試相同路線的功能測試。通過Laravel5輔助模塊進行功能測試通常更容易正常工作並進行調試。一旦你有一個基本的功能測試,並解決你遇到的任何問題,那麼API測試工作就會變得更容易。

+0

謝謝你的精彩見解。所以我這次繼續將POST請求改爲'/ api/authenticate'。所以我挖掘了測試的輸出。我想出了一箇中間件,它檢查令牌以評估有效負載是否搞亂了這些,但中間件不應該由於明顯的原因而對'/ api/authenticate'進行操作。但是當我評論Kernal的中間件時,它運行良好。我該如何解決這個問題? – Rohan

+0

將這個到您的api.suite.yml: 配置: Laravel5: environment_file:.env.testing 在您的文件.env.testing,確保您已設置: APP_ENV =測試 否則應該和你的.env文件一樣。 默認情況下,當APP_ENV =測試中間件沒有運行時。您可以根據具體情況重新啓用它,但應該可以解決您的問題。 – delatbabel

+0

我不確定我是否掌握了所有內容。我更改了配置文件,我甚至會編輯我的答案以包含更改。我創建了.env.testing並將'APP_ENV'設置爲測試。但是我不明白你對中間件的意思。測試仍然失敗。試圖解析它不應該使用的令牌的中間件。一旦我評論Kernal中的中間件,它就通過了,但這不是我想要解決的問題。中間件查看請求是否爲'api/authenticate',然後跳過。也許codeception不執行HTTP請求?它在另一箇中做到了。我很困惑。 – Rohan