Pengujian integrasi HTTP dengan pernyataan Chai.
expect
dan should
antarmuka Ini adalah plugin tambahan untuk Chai Assertion Library. Instal melalui npm.
npm install chai-http
Gunakan plugin ini seperti yang Anda gunakan pada semua plugin Chai lainnya.
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 ) ;
Untuk menggunakan Chai HTTP di halaman web, silakan gunakan versi v4 terbaru untuk saat ini.
Chai HTTP menyediakan antarmuka untuk pengujian integrasi langsung melalui superagent. Untuk melakukan ini, Anda harus terlebih dahulu membuat permintaan ke suatu aplikasi atau url.
Setelah konstruksi, Anda diberikan api yang dapat dirantai yang memungkinkan Anda menentukan permintaan http VERB (dapatkan, posting, dll) yang ingin Anda panggil.
Anda dapat menggunakan fungsi (seperti aplikasi ekspres atau koneksi) atau server node.js http(s) sebagai dasar permintaan Anda. Jika server tidak berjalan, chai-http akan menemukan port yang cocok untuk mendengarkan pengujian yang diberikan.
Catatan: Fitur ini hanya didukung di Node.js, bukan di browser web.
import { request } from 'chai-http' ;
request . execute ( app )
. get ( '/' )
Saat meneruskan app
ke request.execute()
, aplikasi tersebut akan secara otomatis membuka server untuk permintaan masuk (dengan memanggil listen()
) dan, setelah permintaan dibuat, server akan otomatis dimatikan (dengan memanggil .close()
). Jika Anda ingin server tetap terbuka, mungkin jika Anda membuat beberapa permintaan, Anda harus memanggil .keepOpen()
setelah .request()
, dan menutup server secara manual:
import { request } from 'chai-http' ;
const requester = request . Request ( app ) . keepOpen ( )
Promise . all ( [
requester . get ( '/a' ) ,
requester . get ( '/b' ) ,
] )
. then ( responses => { /* ... */ } )
. then ( ( ) => requester . close ( ) )
Anda juga dapat menggunakan url dasar sebagai dasar permintaan Anda.
import { request } from 'chai-http' ;
request . execute ( 'http://localhost:8080' )
. get ( '/' )
Setelah permintaan dibuat dengan KATA KERJA tertentu (dapatkan, posting, dll), Anda menggunakan metode tambahan berikut untuk membuat permintaan Anda:
Metode | Tujuan |
---|---|
.set(key, value) | Tetapkan header permintaan |
.send(data) | Tetapkan data permintaan (tipe default adalah JSON) |
.type(dataType) | Mengubah jenis data yang dikirim dari metode .send() (xml, form, dll) |
.attach(field, file, attachment) | Lampirkan file |
.auth(username, password) | Tambahkan header autentikasi untuk Otentikasi Dasar |
.query(parmasObject) | Rantai pada beberapa parameter GET |
Contoh:
.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
Dalam contoh berikut, kami menggunakan pustaka pernyataan Expect Chai:
const { expect } = chai ;
Untuk membuat permintaan dan menegaskan tanggapannya, metode end
dapat digunakan:
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 ) ;
} ) ;
Karena fungsi end
diteruskan dengan panggilan balik, pernyataan dijalankan secara asinkron. Oleh karena itu, suatu mekanisme harus digunakan untuk memberi tahu kerangka pengujian bahwa panggilan balik telah selesai. Jika tidak, pengujian akan lulus sebelum pernyataan diperiksa.
Misalnya, dalam kerangka pengujian Mocha, hal ini dilakukan dengan menggunakan callback done
, yang menandakan bahwa callback telah selesai, dan pernyataan dapat diverifikasi:
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
} ) ;
} ) ;
Ketika done
diteruskan, Mocha akan menunggu hingga panggilan ke done()
, atau hingga batas waktu habis. done
juga menerima parameter kesalahan saat memberi sinyal selesai.
Jika Promise
tersedia, request
menjadi pustaka yang mendukung Promise - dan rangkaian then
menjadi mungkin:
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 ;
} ) ;
Terkadang Anda perlu menyimpan cookie dari satu permintaan, dan mengirimkannya pada permintaan berikutnya (misalnya, saat Anda ingin masuk dengan permintaan pertama, lalu mengakses sumber daya khusus yang diautentikasi nanti). Untuk ini, .request.agent()
tersedia:
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 ) ;
} ) ;
} ) ;
Catatan: Server yang dimulai oleh request.agent(app)
tidak akan ditutup secara otomatis setelah pengujian. Anda harus menghubungi agent.close()
setelah pengujian untuk memastikan program Anda keluar.
Modul Chai HTTP menyediakan sejumlah pernyataan untuk antarmuka expect
dan should
.
Tegaskan bahwa respons memiliki status disediakan.
expect ( res ) . to . have . status ( 200 ) ;
Tegaskan bahwa objek Response
atau Request
memiliki header. Jika suatu nilai diberikan, kesetaraan nilai akan ditegaskan. Anda juga dapat memberikan ekspresi reguler untuk diperiksa.
Catatan: Saat dijalankan di browser web, kebijakan asal yang sama hanya mengizinkan Chai HTTP membaca header tertentu, yang dapat menyebabkan pernyataan gagal.
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 / ) ;
Tegaskan bahwa objek Response
atau Request
memiliki header.
Catatan: Saat dijalankan di browser web, kebijakan asal yang sama hanya mengizinkan Chai HTTP membaca header tertentu, yang dapat menyebabkan pernyataan gagal.
expect ( req ) . to . have . headers ;
Tegaskan bahwa string mewakili alamat ip yang valid.
expect ( '127.0.0.1' ) . to . be . an . ip ;
expect ( '2001:0db8:85a3:0000:0000:8a2e:0370:7334' ) . to . be . an . ip ;
Tegaskan bahwa objek Response
atau Request
memiliki tipe konten tertentu.
expect ( req ) . to . be . json ;
expect ( req ) . to . be . html ;
expect ( req ) . to . be . text ;
Tegaskan bahwa objek Response
atau Request
memiliki rangkaian karakter tertentu.
expect ( req ) . to . have . charset ( 'utf-8' ) ;
Tegaskan bahwa objek Response
memiliki kode status pengalihan.
expect ( res ) . to . redirect ;
expect ( res ) . to . not . redirect ;
Tegaskan bahwa objek Response
dialihkan ke lokasi yang disediakan.
expect ( res ) . to . redirectTo ( 'http://example.com' ) ;
expect ( res ) . to . redirectTo ( / ^/search/results?orderBy=desc$ / ) ;
Tegaskan bahwa objek Request
memiliki parameter string kueri dengan kunci tertentu, (opsional) sama dengan nilai
expect ( req ) . to . have . param ( 'orderby' ) ;
expect ( req ) . to . have . param ( 'orderby' , 'date' ) ;
expect ( req ) . to . not . have . param ( 'limit' ) ;
Tegaskan bahwa objek Request
atau Response
memiliki header cookie dengan kunci tertentu, (opsional) sama dengan nilai
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
dirilis dengan semantic-release
menggunakan plugin:
commit-analyzer
untuk menentukan versi berikutnya dari pesan komit.release-notes-generator
untuk meringkas rilischangelog
untuk memperbarui file CHANGELOG.md.github
untuk menerbitkan rilis GitHub.git
untuk melakukan aset rilis.npm
untuk mempublikasikan ke npm. (Lisensi MIT)
Hak Cipta (c) Jake Luer [email protected]
Izin dengan ini diberikan, secara gratis, kepada siapa pun yang memperoleh salinan perangkat lunak ini dan file dokumentasi terkait ("Perangkat Lunak"), untuk menggunakan Perangkat Lunak tanpa batasan, termasuk tanpa batasan hak untuk menggunakan, menyalin, memodifikasi, menggabungkan , mempublikasikan, mendistribusikan, mensublisensikan, dan/atau menjual salinan Perangkat Lunak, dan mengizinkan orang yang menerima Perangkat Lunak untuk melakukan hal tersebut, dengan tunduk pada ketentuan berikut:
Pemberitahuan hak cipta di atas dan pemberitahuan izin ini akan disertakan dalam semua salinan atau sebagian besar Perangkat Lunak.
PERANGKAT LUNAK INI DISEDIAKAN "APA ADANYA", TANPA JAMINAN APA PUN, TERSURAT MAUPUN TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN KELAYAKAN UNTUK DIPERDAGANGKAN, KESESUAIAN UNTUK TUJUAN TERTENTU, DAN TIDAK ADA PELANGGARAN. DALAM KEADAAN APA PUN PENULIS ATAU PEMEGANG HAK CIPTA TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN ATAU TANGGUNG JAWAB LAINNYA, BAIK DALAM TINDAKAN KONTRAK, HUKUM ATAU LAINNYA, YANG TIMBUL DARI, DARI ATAU SEHUBUNGAN DENGAN PERANGKAT LUNAK ATAU PENGGUNAAN ATAU HAL-HAL LAIN DALAM PERANGKAT LUNAK.