การทดสอบการรวม HTTP กับการยืนยัน Chai
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 จัดเตรียมอินเทอร์เฟซสำหรับการทดสอบการรวมแบบเรียลไทม์ผ่าน superagent ในการดำเนินการนี้ คุณต้องสร้างคำขอไปยังแอปพลิเคชันหรือ URL ก่อน
ในระหว่างการก่อสร้าง คุณจะได้รับ API แบบลูกโซ่ที่ให้คุณระบุคำขอ http VERB (รับ โพสต์ ฯลฯ) ที่คุณต้องการเรียกใช้
คุณสามารถใช้ฟังก์ชัน (เช่น แอปด่วนหรือเชื่อมต่อ) หรือเซิร์ฟเวอร์ http ของ node.js เป็นพื้นฐานสำหรับคำขอของคุณได้ หากเซิร์ฟเวอร์ไม่ทำงาน chai-http จะค้นหาพอร์ตที่เหมาะสมเพื่อรับฟังการทดสอบที่กำหนด
หมายเหตุ: ฟีเจอร์นี้รองรับเฉพาะ Node.js ไม่ใช่ในเว็บเบราว์เซอร์
import { request } from 'chai-http' ;
request . execute ( app )
. get ( '/' )
เมื่อส่ง app
ไปที่ request.execute()
มันจะเปิดเซิร์ฟเวอร์โดยอัตโนมัติสำหรับคำขอที่เข้ามา (โดยการเรียก listen()
) และเมื่อมีการร้องขอแล้ว เซิร์ฟเวอร์จะปิดตัวลงโดยอัตโนมัติ (โดยการเรียก .close()
) หากคุณต้องการให้เซิร์ฟเวอร์เปิดอยู่ บางทีหากคุณส่งคำขอหลายรายการ คุณต้องเรียก .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 ( ) )
คุณยังอาจใช้ URL พื้นฐานเป็นพื้นฐานของคำขอของคุณได้
import { request } from 'chai-http' ;
request . execute ( 'http://localhost:8080' )
. get ( '/' )
เมื่อสร้างคำขอด้วย VERB ที่กำหนด (รับ โพสต์ ฯลฯ) คุณจะเชื่อมโยงวิธีการเพิ่มเติมเหล่านี้เพื่อสร้างคำขอของคุณ:
วิธี | วัตถุประสงค์ |
---|---|
.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's 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
เพื่ออัพเดตไฟล์ CHANGELOG.mdgithub
เพื่อเผยแพร่รุ่น GitHubgit
เพื่อกระทำการเผยแพร่เนื้อหาnpm
เพื่อเผยแพร่ไปยัง npm (ใบอนุญาตเอ็มไอที)
ลิขสิทธิ์ (c) Jake Luer [email protected]
อนุญาตให้บุคคลใดก็ตามที่ได้รับสำเนาของซอฟต์แวร์นี้และไฟล์เอกสารที่เกี่ยวข้อง ("ซอฟต์แวร์") อนุญาตโดยไม่เสียค่าใช้จ่าย เพื่อจัดการกับซอฟต์แวร์โดยไม่มีข้อจำกัด รวมถึงแต่ไม่จำกัดเพียงสิทธิ์ในการใช้ คัดลอก ปรับเปลี่ยน ผสาน เผยแพร่ แจกจ่าย ให้อนุญาตช่วง และ/หรือขายสำเนาของซอฟต์แวร์ และอนุญาตให้บุคคลที่ได้รับซอฟต์แวร์นี้สามารถทำได้ ภายใต้เงื่อนไขต่อไปนี้:
ประกาศเกี่ยวกับลิขสิทธิ์ข้างต้นและประกาศการอนุญาตนี้จะรวมอยู่ในสำเนาทั้งหมดหรือส่วนสำคัญของซอฟต์แวร์
ซอฟต์แวร์นี้มีให้ "ตามที่เป็น" โดยไม่มีการรับประกันใดๆ ทั้งโดยชัดแจ้งหรือโดยนัย ซึ่งรวมถึงแต่ไม่จำกัดเพียงการรับประกันความสามารถในการค้าขาย ความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ และการไม่ละเมิด ไม่ว่าในกรณีใดผู้เขียนหรือผู้ถือลิขสิทธิ์จะต้องรับผิดต่อการเรียกร้องค่าเสียหายหรือความรับผิดอื่นใดไม่ว่าในการกระทำของสัญญาการละเมิดหรืออย่างอื่นที่เกิดขึ้นจากหรือเกี่ยวข้องกับซอฟต์แวร์หรือการใช้งานหรือข้อตกลงอื่น ๆ ใน ซอฟต์แวร์.