Chai 어설션을 사용한 HTTP 통합 테스트.
expect
하고 인터페이스 should
. 이것은 Chai Assertion Library용 애드온 플러그인입니다. 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는 슈퍼에이전트를 통한 실시간 통합 테스트를 위한 인터페이스를 제공합니다. 이렇게 하려면 먼저 애플리케이션이나 URL에 대한 요청을 구성해야 합니다.
구성 시 호출하려는 http VERB 요청(가져오기, 게시 등)을 지정할 수 있는 연결 가능한 API가 제공됩니다.
요청의 기반으로 기능(예: Express 또는 Connect 앱) 또는 node.js http(s) 서버를 사용할 수 있습니다. 서버가 실행되고 있지 않으면 chai-http는 주어진 테스트를 수신할 적절한 포트를 찾습니다.
참고: 이 기능은 Node.js에서만 지원되며 웹 브라우저에서는 지원되지 않습니다.
import { request } from 'chai-http' ;
request . execute ( app )
. get ( '/' )
app
request.execute()
에 전달하면 들어오는 요청에 대해 서버가 자동으로 열리고( listen()
호출을 통해) 요청이 이루어지면 서버가 자동으로 종료됩니다( .close()
호출을 통해). 서버를 열린 상태로 유지하려면(여러 요청을 하는 경우) .request()
다음에 .keepOpen()
호출하고 수동으로 서버를 닫아야 합니다.
import { request } from 'chai-http' ;
const requester = request . Request ( app ) . keepOpen ( )
Promise . all ( [
requester . get ( '/a' ) ,
requester . get ( '/b' ) ,
] )
. then ( responses => { /* ... */ } )
. then ( ( ) => requester . close ( ) )
요청의 기초로 기본 URL을 사용할 수도 있습니다.
import { request } from 'chai-http' ;
request . execute ( 'http://localhost:8080' )
. get ( '/' )
주어진 동사(get, post 등)를 사용하여 요청이 생성되면 다음과 같은 추가 메서드를 연결하여 요청을 생성합니다.
방법 | 목적 |
---|---|
.set(key, value) | 요청 헤더 설정 |
.send(data) | 요청 데이터 설정(기본 유형은 JSON) |
.type(dataType) | .send() 메서드에서 전송된 데이터 유형(xml, form 등) 변경 |
.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
s의 연결이 가능해집니다.
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 ;
} ) ;
때로는 한 요청의 쿠키를 유지하고 다음 요청과 함께 보내야 하는 경우가 있습니다(예를 들어 첫 번째 요청으로 로그인하고 나중에 인증 전용 리소스에 액세스하려는 경우). 이를 위해 .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
객체에 헤더가 있는지 확인합니다. 값이 제공되면 값과의 동등성이 주장됩니다. 정규식을 전달하여 확인할 수도 있습니다.
참고: 웹 브라우저에서 실행할 때 동일 출처 정책은 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
객체에 헤더가 있는지 확인합니다.
참고: 웹 브라우저에서 실행할 때 동일 출처 정책은 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
객체에 주어진 키(선택적으로) 값과 동일한 쿠키 헤더가 있는지 확인
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
.git
.npm
사용하세요. (MIT 라이센스)
저작권 (c) Jake Luer [email protected]
본 소프트웨어 및 관련 문서 파일("소프트웨어")의 사본을 취득한 모든 사람에게 사용, 복사, 수정, 병합에 대한 권리를 포함하되 이에 국한되지 않고 제한 없이 소프트웨어를 취급할 수 있는 권한이 무료로 부여됩니다. , 소프트웨어 사본을 게시, 배포, 재라이센스 부여 및/또는 판매하고, 소프트웨어를 제공받은 사람에게 다음 조건에 따라 그렇게 하도록 허용합니다.
위의 저작권 고지와 본 허가 고지는 소프트웨어의 모든 사본 또는 상당 부분에 포함됩니다.
소프트웨어는 상품성, 특정 목적에의 적합성 및 비침해에 대한 보증을 포함하되 이에 국한되지 않고 명시적이든 묵시적이든 어떠한 종류의 보증 없이 "있는 그대로" 제공됩니다. 어떠한 경우에도 작성자나 저작권 보유자는 계약, 불법 행위 또는 기타 행위로 인해 소프트웨어나 사용 또는 기타 거래와 관련하여 발생하는 모든 청구, 손해 또는 기타 책임에 대해 책임을 지지 않습니다. 소프트웨어.