使用 Chai 斷言進行 HTTP 整合測試。
expect
和should
接口這是 Chai 斷言函式庫的附加插件。透過 npm 安裝。
npm install chai-http
像使用所有其他 Chai 插件一樣使用此外掛程式。
import * as chai from "chai" ;
import chaiHttp from "chai-http" ;
chai . use ( chaiHttp ) ;
// if you need to access `request`
import { default as chaiHttp , request } from "chai-http" ;
chai . use ( chaiHttp ) ;
request . get ( ... ) . send ( ... ) ;
// or setting up an app
request . execute ( app ) ;
若要在網頁上使用 Chai HTTP,請暫時使用最新的 v4 版本。
Chai HTTP 提供了一個透過 superagent 進行即時整合測試的介面。為此,您必須先建構對應用程式或 URL 的請求。
建置後,您將獲得一個可連結的 api,允許您指定您希望呼叫的 http VERB 請求(get、post 等)。
您可以使用函數(例如express或connect應用程式)或node.js http(s)伺服器作為請求的基礎。如果伺服器未運行,chai-http 將找到一個合適的連接埠來偵聽給定的測試。
注意:此功能僅在 Node.js 上受支持,在 Web 瀏覽器中不受支援。
import { request } from 'chai-http' ;
request . execute ( app )
. get ( '/' )
當將app
傳遞給request.execute()
時,它將自動開啟伺服器以接收傳入請求(透過呼叫listen()
),並且一旦發出請求,伺服器將自動關閉(透過呼叫.close()
)。如果您想要保持伺服器打開,也許您正在發出多個請求,則必須在 .request .keepOpen()
.request()
,並手動關閉伺服器:
import { request } from 'chai-http' ;
const requester = request . Request ( app ) . keepOpen ( )
Promise . all ( [
requester . get ( '/a' ) ,
requester . get ( '/b' ) ,
] )
. then ( responses => { /* ... */ } )
. then ( ( ) => requester . close ( ) )
您也可以使用基本網址作為請求的基礎。
import { request } from 'chai-http' ;
request . execute ( 'http://localhost:8080' )
. get ( '/' )
使用給定的動詞(get、post 等)建立請求後,您可以連結這些附加方法來建立請求:
方法 | 目的 |
---|---|
.set(key, value) | 設定請求標頭 |
.send(data) | 設定請求資料(預設類型為JSON) |
.type(dataType) | 更改從.send() 方法發送的資料類型(xml、表單等) |
.attach(field, file, attachment) | 附上文件 |
.auth(username, password) | 新增基本身份驗證的身份驗證標頭 |
.query(parmasObject) | 連結一些 GET 參數 |
範例:
.set()
import { request } from 'chai-http' ;
// Set a request header
request . execute ( app )
. put ( '/user/me' )
. set ( 'Content-Type' , 'application/json' )
. send ( { password : '123' , confirmPassword : '123' } )
.send()
import { request } from 'chai-http' ;
// Send some JSON
request . execute ( app )
. put ( '/user/me' )
. send ( { password : '123' , confirmPassword : '123' } )
.type()
import { request } from 'chai-http' ;
// Send some Form Data
request . execute ( app )
. post ( '/user/me' )
. type ( 'form' )
. send ( {
'_method' : 'put' ,
'password' : '123' ,
'confirmPassword' : '123'
} )
.attach()
import { request } from 'chai-http' ;
// Attach a file
request . execute ( app )
. post ( '/user/avatar' )
. attach ( 'imageField' , fs . readFileSync ( 'avatar.png' ) , 'avatar.png' )
.auth()
import { request } from 'chai-http' ;
// Authenticate with Basic authentication
request . execute ( app )
. get ( '/protected' )
. auth ( 'user' , 'pass' )
// Authenticate with Bearer Token
request . execute ( app )
. get ( '/protected' )
. auth ( accessToken , { type : 'bearer' } )
.query()
import { request } from 'chai-http' ;
// Chain some GET query parameters
request . execute ( app )
. get ( '/search' )
. query ( { name : 'foo' , limit : 10 } ) // /search?name=foo&limit=10
在以下範例中,我們使用 Chai 的 Expect 斷言函式庫:
const { expect } = chai ;
要發出請求並斷言其回應,可以使用end
方法:
import { request } from 'chai-http' ;
request . execute ( app )
. put ( '/user/me' )
. send ( { password : '123' , confirmPassword : '123' } )
. end ( ( err , res ) => {
expect ( err ) . to . be . null ;
expect ( res ) . to . have . status ( 200 ) ;
} ) ;
因為end
函數傳遞了一個回調,所以斷言是非同步運行的。因此,必須使用一種機制來通知測試框架回呼已完成。否則,測試將在檢查斷言之前通過。
例如,在 Mocha 測試框架中,這是使用done
回調來完成的,它表示回呼已完成,並且可以驗證斷言:
import { request } from 'chai-http' ;
it ( 'fails, as expected' , function ( done ) { // <= Pass in done callback
request . execute ( 'http://localhost:8080' )
. get ( '/' )
. end ( ( err , res ) => {
expect ( res ) . to . have . status ( 123 ) ;
done ( ) ; // <= Call done to signal callback end
} ) ;
} ) ;
it ( 'succeeds silently!' , ( ) => { // <= No done callback
request . execute ( 'http://localhost:8080' )
. get ( '/' )
. end ( ( err , res ) => {
expect ( res ) . to . have . status ( 123 ) ; // <= Test completes before this runs
} ) ;
} ) ;
當done
傳入時,Mocha 將等待,直到呼叫done()
,或直到逾時到期。在發出完成訊號時, done
也接受錯誤參數。
如果Promise
可用,則request
將成為具有 Promise 功能的庫 - 並且then
的連結成為可能:
import { request } from 'chai-http' ;
request . execute ( app )
. put ( '/user/me' )
. send ( { password : '123' , confirmPassword : '123' } )
. then ( ( res ) => {
expect ( res ) . to . have . status ( 200 ) ;
} )
. catch ( ( err ) => {
throw err ;
} ) ;
有時,您需要保留一個請求中的 cookie,並與下一個請求一起發送(例如,當您想要使用第一個請求登錄,然後稍後訪問僅經過身份驗證的資源時)。為此,可以使用.request.agent()
:
import { request } from 'chai-http' ;
// Log in
const agent = request . agent ( app )
agent
. post ( '/session' )
. send ( { username : 'me' , password : '123' } )
. then ( ( res ) => {
expect ( res ) . to . have . cookie ( 'sessionid' ) ;
// The `agent` now has the sessionid cookie saved, and will send it
// back to the server in the next request:
return agent . get ( '/user/me' )
. then ( ( res ) => {
expect ( res ) . to . have . status ( 200 ) ;
} ) ;
} ) ;
注意:由request.agent(app)
啟動的伺服器不會在測試後自動關閉。您應該在測試後呼叫agent.close()
以確保程式退出。
Chai HTTP 模組為expect
和should
介面提供了許多斷言。
斷言響應具有提供的狀態。
expect ( res ) . to . have . status ( 200 ) ;
斷言Response
或Request
物件具有標頭。如果提供了值,則將斷言與值相等。您也可以傳遞正規表示式進行檢查。
注意:在 Web 瀏覽器中執行時,同源策略僅允許 Chai HTTP 讀取某些標頭,這可能會導致斷言失敗。
expect ( req ) . to . have . header ( 'x-api-key' ) ;
expect ( req ) . to . have . header ( 'content-type' , 'text/plain' ) ;
expect ( req ) . to . have . header ( 'content-type' , / ^text / ) ;
斷言Response
或Request
物件具有標頭。
注意:在 Web 瀏覽器中執行時,同源策略僅允許 Chai HTTP 讀取某些標頭,這可能會導致斷言失敗。
expect ( req ) . to . have . headers ;
斷言字串代表有效的 IP 位址。
expect ( '127.0.0.1' ) . to . be . an . ip ;
expect ( '2001:0db8:85a3:0000:0000:8a2e:0370:7334' ) . to . be . an . ip ;
斷言Response
或Request
物件具有給定的內容類型。
expect ( req ) . to . be . json ;
expect ( req ) . to . be . html ;
expect ( req ) . to . be . text ;
斷言Response
或Request
物件具有給定的字元集。
expect ( req ) . to . have . charset ( 'utf-8' ) ;
斷言Response
物件具有重定向狀態碼。
expect ( res ) . to . redirect ;
expect ( res ) . to . not . redirect ;
斷言Response
物件重定向到提供的位置。
expect ( res ) . to . redirectTo ( 'http://example.com' ) ;
expect ( res ) . to . redirectTo ( / ^/search/results?orderBy=desc$ / ) ;
斷言Request
物件具有帶有給定鍵(可選)等於值的查詢字串參數
expect ( req ) . to . have . param ( 'orderby' ) ;
expect ( req ) . to . have . param ( 'orderby' , 'date' ) ;
expect ( req ) . to . not . have . param ( 'limit' ) ;
斷言Request
或Response
物件具有帶有給定鍵(可選)等於值的 cookie 標頭
expect ( req ) . to . have . cookie ( 'session_id' ) ;
expect ( req ) . to . have . cookie ( 'session_id' , '1234' ) ;
expect ( req ) . to . not . have . cookie ( 'PHPSESSID' ) ;
expect ( res ) . to . have . cookie ( 'session_id' ) ;
expect ( res ) . to . have . cookie ( 'session_id' , '1234' ) ;
expect ( res ) . to . not . have . cookie ( 'PHPSESSID' ) ;
chai-http
使用以下插件與semantic-release
一起發布:
commit-analyzer
根據提交訊息確定下一個版本。release-notes-generator
用於總結發行版本changelog
。github
發布 GitHub 版本。git
提交發布資產。npm
發佈到 npm。 (麻省理工學院許可證)
版權所有 (c) Jake Luer [email protected]
特此免費授予任何獲得本軟體和相關文件文件(「軟體」)副本的人不受限制地使用本軟體,包括但不限於使用、複製、修改、合併的權利、發布、分發、再授權和/或銷售軟體的副本,並允許向其提供軟體的人員這樣做,但須滿足以下條件:
上述版權聲明和本授權聲明應包含在本軟體的所有副本或主要部分中。
本軟體以「現況」提供,不提供任何明示或暗示的保證,包括但不限於適銷性、特定用途的適用性和不侵權的保證。 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE軟體.