使用 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]
特此免费授予获得本软件和相关文档文件(“软件”)副本的任何人不受限制地使用本软件,包括但不限于使用、复制、修改、合并的权利、发布、分发、再许可和/或销售软件的副本,并允许向其提供软件的人员这样做,但须满足以下条件:
上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。
本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有者均不对因本软件或本软件中的使用或其他交易而产生或与之相关的任何索赔、损害或其他责任负责,无论是合同、侵权行为还是其他行为。软件。