سؤال

لدي خادم https يعمل بواسطة Express، وأختبره باستخدام Mocha وSupertest.

مشكلتي هي - إذا قمت بإجراء الاختبار فقط - فلا بأس.إذا حاولت تشغيل gruntfile مع الاختبار، فقم بتشغيل Express - أرى الكثير من أخطاء EADDRINUSE، حتى لو كنت في ملفات الاختبار أفعل ذلك بعد () مع app.إغلاق ().وينطبق الشيء نفسه على مراقبة المهمة في الاختبارات.

هنا هو اختبار سبيل المثال الخاص بي:

/* 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();
            });
        });
    });

}());

أدرك أن تلك الاختبارات بعيدة كل البعد عن الكمال.لقد بدأت للتو مغامرتي باختبار البرامج المناسب.

كل تلك "المنافذ المستخدمة بالفعل" واضحة، ولا أحد منها...إعطاء أي قضية.جميع الاختبارات تعمل بشكل جيد، والخادم يعمل بشكل جيد، ولكن stdout مجنون.ومثل هذا السلوك بعيد كل البعد عن المثالية، وربما مليئ بالمشاكل المحتملة وقضايا عدم الاستقرار.

سؤالي هو - كيف أتخلص منه؟

أفكاري هي:

  • إنشاء خادم مخصص للاختبار على منفذ مختلف فقط.لسوء الحظ لا بد لي من معرفة كيفية تنفيذ ذلك.

  • جعل بعض الشروط للوكيل الفائق لتشغيل الخادم إذا لم يكن قيد التشغيل، أو فقط...تمريرها إلى superagent وإلا؟

  • استخدم شيئًا آخر ثم وكيلًا فائقًا (مثل الطلب، لكنني لست متأكدًا مما إذا كانت جميع ملفات تعريف الارتباط وnode_tls_reject_unauthorized ستعمل.

كما ترون - أواجه صعوبة في التعامل مع هذا الموضوع ولدي أسئلة أكثر من الإجابات، وليس لدي خبرة كافية لمعرفة المكان الذي يجب أن أنظر إليه.

وأنا أقدر أي مساعدة.

يحرر:

لقد وجدت أنه يمكنني القيام بما يلي:

before(function(done) {
    app.listen(3001, function() { done(); });
});

الذي يبدأ الاختبار على منفذ آخر ولكن ...يتم تحميل server.js بالكامل على أي حال، لذلك يبدأ على أي حال أيضًا.ثم، عند تشغيله مع خادم قيد التشغيل، يكون هناك EADDRINUSE واضح.

هل كانت مفيدة؟

المحلول

عند الاستخدام superagent, ، يجب عليك دائمًا تمرير تطبيق Express الذي تم تكوينه (برنامج وسيط مسجل، توجيه وحدات التحكم، وما إلى ذلك) - ولكن لم تتم تهيئته كخادم HTTP.سوف يفعل ذلك من أجلك وسوف يؤجل http.createServer, ، إلى نظام التشغيل لاختيار منفذ متاح.

إذا كان لديك حاليًا ذلك 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
        });
    });
});

هذا فقط للأغراض التوضيحية، حيث يعتمد وقت/كيفية إنشاء مثيل التطبيق على سياق الاختبار الخاص بك.الشيء المهم الذي يجب أخذه هو أنه يجب أن تكون قادرًا على إنشاء مثيلات خادم جديدة ونظيفة ومستقلة ومعزولة لحالات الاختبار الخاصة بك.إنها ضرورة مطلقة إذا كنت تستخدم عداء اختبار ينفذ الاختبارات بالتوازي أو بترتيب عشوائي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top