• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

chaijs/chai-http: HTTP Response assertions for the Chai Assertion Library.

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

chaijs/chai-http

开源软件地址:

https://github.com/chaijs/chai-http

开源编程语言:

JavaScript 89.7%

开源软件介绍:

Chai HTTP semantic-release NPM version Dependency Status devDependencies

HTTP integration testing with Chai assertions.

Features

  • integration test request composition
  • test http apps or external services
  • assertions for common http tasks
  • chai expect and should interfaces

Installation

This is an addon plugin for the Chai Assertion Library. Install via npm.

npm install chai-http

Plugin

Use this plugin as you would all other Chai plugins.

const chai = require('chai');
const chaiHttp = require('chai-http');

chai.use(chaiHttp);

To use Chai HTTP on a web page, just include the dist/chai-http.js file:

<script src="chai.js"></script>
<script src="chai-http.js"></script>
<script>
  chai.use(chaiHttp);
</script>

Integration Testing

Chai HTTP provides an interface for live integration testing via superagent. To do this, you must first construct a request to an application or url.

Upon construction you are provided a chainable api that allows you to specify the http VERB request (get, post, etc) that you wish to invoke.

Application / Server

You may use a function (such as an express or connect app) or a node.js http(s) server as the foundation for your request. If the server is not running, chai-http will find a suitable port to listen on for a given test.

Note: This feature is only supported on Node.js, not in web browsers.

chai.request(app)
  .get('/')

When passing an app to request; it will automatically open the server for incoming requests (by calling listen()) and, once a request has been made the server will automatically shut down (by calling .close()). If you want to keep the server open, perhaps if you're making multiple requests, you must call .keepOpen() after .request(), and manually close the server down:

const requester = chai.request(app).keepOpen()

Promise.all([
  requester.get('/a'),
  requester.get('/b'),
])
.then(responses => { /* ... */ })
.then(() => requester.close())

URL

You may also use a base url as the foundation of your request.

chai.request('http://localhost:8080')
  .get('/')

Setting up requests

Once a request is created with a given VERB (get, post, etc), you chain on these additional methods to create your request:

Method Purpose
.set(key, value) Set request headers
.send(data) Set request data (default type is JSON)
.type(dataType) Change the type of the data sent from the .send() method (xml, form, etc)
.attach(field, file, attachment) Attach a file
.auth(username, password) Add auth headers for Basic Authentication
.query(parmasObject) Chain on some GET parameters

Examples:

.set()

// Set a request header
chai.request(app)
  .put('/user/me')
  .set('Content-Type', 'application/json')
  .send({ password: '123', confirmPassword: '123' })

.send()

// Send some JSON
chai.request(app)
  .put('/user/me')
  .send({ password: '123', confirmPassword: '123' })

.type()

// Send some Form Data
chai.request(app)
  .post('/user/me')
  .type('form')
  .send({
    '_method': 'put',
    'password': '123',
    'confirmPassword': '123'
  })

.attach()

// Attach a file
chai.request(app)
  .post('/user/avatar')
  .attach('imageField', fs.readFileSync('avatar.png'), 'avatar.png')

.auth()

// Authenticate with Basic authentication
chai.request(app)
  .get('/protected')
  .auth('user', 'pass')
  
// Authenticate with Bearer Token
chai.request(app)
  .get('/protected')
  .auth(accessToken, { type: 'bearer' })  
  

.query()

// Chain some GET query parameters
chai.request(app)
  .get('/search')
  .query({name: 'foo', limit: 10}) // /search?name=foo&limit=10

Dealing with the response - traditional

In the following examples we use Chai's Expect assertion library:

const { expect } = chai;

To make the request and assert on its response, the end method can be used:

chai.request(app)
  .put('/user/me')
  .send({ password: '123', confirmPassword: '123' })
  .end((err, res) => {
     expect(err).to.be.null;
     expect(res).to.have.status(200);
  });
Caveat

Because the end function is passed a callback, assertions are run asynchronously. Therefore, a mechanism must be used to notify the testing framework that the callback has completed. Otherwise, the test will pass before the assertions are checked.

For example, in the Mocha test framework, this is accomplished using the done callback, which signal that the callback has completed, and the assertions can be verified:

it('fails, as expected', function(done) { // <= Pass in done callback
  chai.request('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
  chai.request('http://localhost:8080')
  .get('/')
  .end((err, res) => {
    expect(res).to.have.status(123);    // <= Test completes before this runs
  });
});

When done is passed in, Mocha will wait until the call to done(), or until the timeout expires. done also accepts an error parameter when signaling completion.

Dealing with the response - Promises

If Promise is available, request() becomes a Promise capable library - and chaining of thens becomes possible:

chai.request(app)
  .put('/user/me')
  .send({ password: '123', confirmPassword: '123' })
  .then((res) => {
     expect(res).to.have.status(200);
  })
  .catch((err) => {
     throw err;
  });

Note: Some older web browsers do not have native promise support. You can use any spec compliant library, such as:

// Add promise support if this does not exist natively.
if (!global.Promise) {
  global.Promise = require('q');
}
const chai = require('chai');
chai.use(require('chai-http'));

Retaining cookies with each request

Sometimes you need to keep cookies from one request, and send them with the next (for example, when you want to login with the first request, then access an authenticated-only resource later). For this, .request.agent() is available:

// Log in
const agent = chai.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);
      });
  });

Note: The server started by chai.request.agent(app) will not automatically close following the test(s). You should call agent.close() after your tests to ensure your program exits.

Assertions

The Chai HTTP module provides a number of assertions for the expect and should interfaces.

.status (code)

  • @param {Number} status number

Assert that a response has a supplied status.

expect(res).to.have.status(200);

.header (key[, value])

  • @param {String} header key (case insensitive)
  • @param {String|RegExp} header value (optional)

Assert that a Response or Request object has a header. If a value is provided, equality to value will be asserted. You may also pass a regular expression to check.

Note: When running in a web browser, the same-origin policy only allows Chai HTTP to read certain headers, which can cause assertions to fail.

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/);

.headers

Assert that a Response or Request object has headers.

Note: When running in a web browser, the same-origin policy only allows Chai HTTP to read certain headers, which can cause assertions to fail.

expect(req).to.have.headers;

.ip

Assert that a string represents valid ip address.

expect('127.0.0.1').to.be.an.ip;
expect('2001:0db8:85a3:0000:0000:8a2e:0370:7334').to.be.an.ip;

.json / .text / .html

Assert that a Response or Request object has a given content-type.

expect(req).to.be.json;
expect(req).to.be.html;
expect(req).to.be.text;

.charset

Assert that a Response or Request object has a given charset.

expect(req).to.have.charset('utf-8');

.redirect

Assert that a Response object has a redirect status code.

expect(res).to.redirect;
expect(res).to.not.redirect;

.redirectTo

  • @param {String|RegExp} location url

Assert that a Response object redirects to the supplied location.

expect(res).to.redirectTo('http://example.com');
expect(res).to.redirectTo(/^\/search\/results\?orderBy=desc$/);

.param

  • @param {String} parameter name
  • @param {String} parameter value

Assert that a Request object has a query string parameter with a given key, (optionally) equal to value

expect(req).to.have.param('orderby');
expect(req).to.have.param('orderby', 'date');
expect(req).to.not.have.param('limit');

.cookie

  • @param {String} parameter name
  • @param {String} parameter value

Assert that a Request or Response object has a cookie header with a given key, (optionally) equal to value

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');

Releasing

chai-http is released with semantic-release using the plugins:


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap