Domanda

Ho un server HTTPS in esecuzione da Express, che testerò usando MOCHA e SuperTest.

Il mio problema è - se eseguo solo il test - è OK. Se provo a eseguire GruntFile con il test, esegui, quindi eseguire Express - vedo molti errori Eaddrinuse, anche se nei file di test che faccio dopo () con app.Close (). Lo stesso vale per guardare il compito sui test.

Ecco il mio test 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();
            });
        });
    });

}());
.

Sono consapevole che quei test sono tutt'altro che perfetti. Sto appena iniziando la mia avventura con i corretti test software.

Tutte quelle "Porta già in uso" sono ovvie, e nessuno di essi ... dare qualsiasi problema. Tutti i test funzionano bene, il server funziona bene, ma lo stdout è pazzo. Tale comportamento è lontano dall'ideale, e probabilmente pieno di potenziali problemi e problemi di instabilità.

La mia domanda è - Come sbarazzarsi di esso?

Le mie idee sono:

    .
  • Crea server dedicato per il test su una porta solo diversa. Purtroppo devo indirizzare come implementare questo.

  • Fai un po 'condizionale per il SuperAgent per eseguire il server se non è in esecuzione, o semplicemente ... passalo a Superagent altrimenti?

  • Usa qualcos'altro quindi superagent (come la richiesta, ma non sono sicuro se tutti i cookie e node_tls_reject_unauthorized funzionino.

Come puoi vedere - lotto con quell'argomento e ho più domande che risposte, e non abbastanza esperienza per sapere dove guardare.

Apprezzo gentilmente qualsiasi aiuto.

Modifica:

Ho trovato, che posso fare:

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

Che inizia il test su un'altra porta ma ... l'intero server.js è caricato comunque, quindi inizia comunque. Quindi, quando lo spara insieme al server di esecuzione, c'è ovvio Eaddrinuse.

È stato utile?

Soluzione

Quando si utilizza superagent, è necessario passare sempre un'applicazione Express configurata (Middleware registrata, controller instradati, ecc.) - Ma non inizializzato come server HTTP. Lo farà per te e perferrà, attraverso http.createServer , al sistema operativo per selezionare una porta disponibile. < / P >.

Se al momento del modulo server.js fornisce già un'istanza statica di un server HTTP completato, che è molto probabilmente la fonte dei tuoi problemi. In entrambi i casi, provare a estrarre la configurazione / bootstrapping dell'applicazione dall'istanza effettiva del server come:

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

Allora, nei tuoi test, puoi fare qualcosa lungo le linee:

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

Questo è solo a scopo illustrativo, dove il whiver / come di istanziazione dell'istanza dell'applicazione dipenderà dal contesto del test. La cosa importante da portare via è che dovresti essere in grado di creare istanze di server fresche, pulite, indipendenti e isolate per i tuoi casi di test. È una necessità assoluta dovresti usare un runner di test che esegue test in parallelo o in un ordine casuale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top