Supertest、Express、Mochaを使ったGrunt Testing API
-
21-12-2019 - |
質問
私はExpressによって実行されているHTTPSサーバーを持っています。これは、MochaとSuperTestを使用してテストします。
私の問題は - テストのみを実行すると、その大丈夫です。テストでGrantFileを実行しようとすると、Expressを実行します。 テストでタスクを見ることは同じです。
これは私の外出テストです:
/* 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はそれらのテストが完璧から遠く離れていることを認識しています。私は正しいソフトウェアテストで私の冒険を始めています。
すべての人がすべての「港を使って」は明らかであり、どれも...問題を与えません。すべてのテストがうまく機能し、サーバーは大丈夫ですが、標準は狂っています。そのような行動は理想からはるかに、おそらく潜在的な問題と不安定問題に満ちています。
私の質問はそれを取り除く方法ですか?
私の考えは:
-
異なるポートでテストするための専用サーバーを作成します。残念ながら私はこれを実装する方法を手に入れる必要があります。
-
SuperAgentが実行されていない場合はSuperAgentがSuperAgentを実行するか、単に...そうでないとしていますか?
-
それ以外の何かを使う(要求のように)他のものを使う(しかし、すべてのCookieとnode_tls_reject_unauthorizedがうまくいくかどうかはかかりません。
見ることができるように - 私はそのトピックと闘い、答えよりも多くの質問をしており、どこに見える場所を知るのに十分な経験がありません。
私は親切に助けを感謝します。
編集:
私は私ができることを見つけました:
before(function(done) {
app.listen(3001, function() { done(); });
});
.
他のポートでテストを開始するのですが...とにかくサーバー全体がロードされているので、とにかく起動します。次に、実行中のサーバーと一緒に発射するとき、明らかなEADDRinuseがあります。
解決
superagent
を使用する場合は、常に設定されているExpressアプリケーション(ミドルウェア登録、コントローラなど) - がHTTPサーバとして初期化されていないはずです。 http.createServer
を介して、利用可能なポートを選択します。< / P>
現在server.js
モジュールが既にフルブロー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
});
});
});
.
これは例示の目的で、アプリケーションインスタンスをインスタンス化するときにテストコンテキストによって依存する場合に限ります。取るべき重要なことは、テストケースのために新鮮で清潔で独立した、そして絶縁されたサーバーのインスタンスを作成できるようにする必要があります。それは絶対的な必要性ですあなたは並列またはランダムな順序でテストを実行するテストランナーを使うべきです。