른록노트
[Javascript] supertest 사용법 본문
supertest
superagent를 통해 HTTP assertion이 더 쉬워졌습니다.
about
supertest의 동기는 HTTP 테스트를 위한 high-level 추상화를 제공하는 동시에 superagent에서 제공하는 lower-level API을 사용할 수 있도록 합니다.
설치방법
npm install supertest --save-dev
사용법
일단 설치되면 이제 단순히 require('supertest');를 호출하여 참조할 수 있습니다.
http.Server 또는 함수를 request()에 전달할 수 있습니다. 서버가 아직 connections을 listening 하지 않는 경우 임시 포트에 바인딩되므로 포트를 추적할 필요가 없습니다.
SuperTest는 모든 테스트 프레임워크에서 작동합니다. 다음은 테스트 프레임워크를 전혀 사용하지 않은 예입니다.
const request = require('supertest');
const express = require('express');
const app = express();
app.get('/user', function(req, res) {
res.status(200).json({ name: 'john' });
});
request(app)
.get('/user')
.expect('Content-Type', /json/)
.expect('Content-Length', '15')
.expect(200)
.end(function(err, res) {
if (err) throw err;
});
mongoose와 jest를 사용하는 프로젝트 예 입닌다.
const request = require('supertest');
const app = require('../api/index'); // 사용하는 express
beforeAll(async () => {
await mongoose
.connect(config.mongoTestUrl, {})
.then(() => console.log('Test MongoDB Connected...'))
.catch((err) => console.log(err));
});
afterAll(async () => {
await mongoose.connection.close();
});
describe('[Api 테스트]', () => {
test('POST /api/test 테스트', function (done) {
request(app)
.post('/api/test')
.send({
data: 'testUser',
})
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200)
.end(function (err, res) {
if (err) return done(err);
expect(res.body.success).not.toBeNull();
return done();
});
});
});
API
.write(), .pipe() 등을 포함한 모든 superagent 메서드를 사용할 수 있으며 하위 수준 요구 사항에 대해 .end() 콜백에서 어설션을 수행할 수 있습니다.
.expect(status[, fn])
Assert response status code.
.expect(status, body[, fn])
Assert response status code and body.
.expect(body[, fn])
Assert response body text with a string, regular expression, or parsed body object.
.expect(field, value[, fn])
Assert header field value with a string or regular expression.
.expect(function(res) {})
Pass a custom assertion function. It'll be given the response object to check. If the check fails, throw an error.
request(app)
.get('/')
.expect(hasPreviousAndNextKeys)
.end(done);
function hasPreviousAndNextKeys(res) {
if (!('next' in res.body)) throw new Error("missing next key");
if (!('prev' in res.body)) throw new Error("missing prev key");
}
.end(fn)
Perform the request and invoke fn(err, res).