가장 훌륭한, 익스프레스 및 모카가있는 멍청한 테스트 API
-
21-12-2019 - |
문제
익스프레스에 의해 실행되는 HTTPS 서버가 있습니다.
내 문제는 테스트 만 실행하면 - ok. Test로 그르르템 필일을 실행하려고하면 Express를 실행하십시오. App.Close ()를 사용하여 수행 한 테스트 파일에있는 경우에도 EaddrinUse 오류가 많이 있습니다. 테스트에서 작업을 시청하는 데 동일한 적용됩니다.
여기에 내 exapmle 테스트가 있습니다 :
/* jshint node: true*/
/*global describe, it, after*/
(function() {
'use strict';
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
var request = require('supertest');
var app = require('../server.js').app;
var expect = require('chai').expect;
var Cookies;
after(function(done) {
app.close();
setTimeout(function(){done();}, 1500);
});
describe('/login', function() {
it('should auth the user', function(done) {
request(app)
.post('/login')
.send({login: "test", password: 'test'})
.expect(302)
.end(function(err, res) {
expect(err).to.be.equal(null);
expect(res.text).to.be.equal("Moved Temporarily. Redirecting to /");
Cookies = res.headers['set-cookie'].pop().split(';')[0];
done();
});
});
});
// testing API for serving session data for angualar factory
describe('/api/session', function() {
it('should return session data in JSON', function(done) {
var req = request(app).get('/api/session');
req.cookies = Cookies;
req.set('Accept','application/json')
.end(function(err, res) {
expect(err).to.be.equal(null);
expect(res.body).to.have.property("_id");
done();
});
});
});
}());
.
IM은 그 테스트가 완벽한 것과는 거리가 멀다는 것을 알고 있습니다. 나는 적절한 소프트웨어 테스트를 통해 모험을 시작합니다.
이미 사용중인 포트는 분명하고 그 중 누구도 없으며 문제가 없습니다. 모든 테스트는 잘 작동합니다. 서버는 잘 작동하지만 stdout은 미쳤습니다. 이러한 행동은 이상적이며 잠재적 인 문제와 불안정성 문제가 가득합니다.
내 질문은 - 그것을 제거하는 방법
내 아이디어는 다음과 같습니다 :
-
방금 다른 포트에서 테스트를 위해 전용 서버를 만듭니다. 불행히도 나는 이것을 구현하는 방법을 단서해야합니다.
-
실행이 아닌 경우 서버를 실행하는 경우 superAgent를 조건으로 만들거나 그렇지 않으면 superAgent로 전달하십시오
-
다른 것을 사용하면 superAgent를 사용하십시오 (같은 경우, 모든 쿠키와 node_tls_reject_unauthorized가 작동하지 않는지 확실하지 않습니다.
당신이 볼 수있는 것처럼 - 나는 그 주제와 어려움을 겪고 답변보다 더 많은 질문을하고, 어디에서 볼 지 알 수있는 경험이 충분하지 않다.
나는 친절하게 감사드립니다.
편집 :
나는 할 수 있다는 것을 발견했습니다 :
before(function(done) {
app.listen(3001, function() { done(); });
});
.
다른 포트에서 테스트를 시작하지만 ... 전체 Server.js는 어쨌든로드되므로 어쨌든 시작됩니다. 그런 다음 실행중인 서버와 함께 실행할 때는 분명한 Eddrinuse가 있습니다.
해결책
superagent
를 사용할 때, 구성된 익스프레스 응용 프로그램 (미들웨어 등록, 컨트롤러가 라우트 등)을 전달해야하지만 HTTP 서버로 초기화되지는 않습니다. 그것은 당신을 위해 그것을 할 것이고 http.createServer
를 통해 사용 가능한 포트를 선택하여 < / P>
현재 server.js
모듈이 이미 전체 Blown HTTP 서버의 정적 인스턴스를 제공하고 있으면 문제의 원인이 가장 가능성이 높습니다. 두 경우 모두 실제 서버 인스턴스화에서 응용 프로그램 구성 / 부트 스트랩을 다음과 같이 추출하십시오.
// server.js
var express = require('express');
var middleware = require('./middleware');
var controllers = require('./controllers');
// Configures the Express application instance.
exports.setup = function (app) {
app.use(middleware.foo);
app.get('/bar', controllers.bar);
app.locals.baz = 'quux';
}
// You might shoot yourself in the foot if parts of your application depend
// on a static reference at `server.app`.
exports.app = setup(express());
exports.app.listen(3000);
.
그런 다음 테스트에서 라인을 따라 무언가를 할 수 있습니다.
// tests.js
var express = require('express');
var server = require('./server');
describe('Server tests', function () {
// Create a fresh server instance prior to each test
beforeEach(function createNewSever() {
this.app = server.setup(express());
});
describe('Foo', function () {
it('barrs', function () {
request(this.app) // initializes a server instance on port A
// ... supertests
});
it('bazzes', function () {
request(this.app) // initializes a server instance on port B
// ... more supertests
});
});
});
.
이것은 응용 프로그램 인스턴스를 인스턴스화하는 방법이 테스트 컨텍스트에 따라 달라지는 WHEN / HOWERATION을위한 예시적인 목적을위한 것입니다. 중요한 것은 테스트 케이스에 대한 신선하고 깨끗하고 독립적이며 격리 된 서버 인스턴스를 만들 수 있어야한다는 것입니다. 병렬 또는 임의의 순서로 테스트를 실행하는 테스트 러너를 사용해야합니다.