Pregunta

Tengo un servidor https corriendo por expreso, lo cual me prueba el uso de mocha y supertest.

Mi problema es que - si me quedo sólo la prueba de su autorización.Si intento ejecutar gruntfile con la prueba, a continuación, ejecutar el express - veo un montón de EADDRINUSE errores, incluso si en los archivos de prueba tengo que hacer después de() con la aplicación.close().Mismo se aplica para ver la tarea en los exámenes.

Aquí está mi exapmle prueba:

/* 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 consciente de que esas pruebas están lejos de ser perfectos.Im acabo de empezar mi aventura con la debida pruebas de software.

Todos aquellos "el puerto ya está en uso" son obvias, y ninguno de ellos...dar ningún problema.todas las pruebas funcionan bien, el servidor funciona bien, pero stdout es una locura.Tal comportamiento está lejos de ser ideal, y probablemente lleno de problemas potenciales y de la precariedad de los problemas.

Mi pregunta es - ¿cómo deshacerse de él?

Mis ideas son:

  • crear servidor dedicado para la prueba en solo puerto diferente.Lamentablemente tengo ni idea de cómo implementar esto.

  • hacer algunos condicional para superagent para ejecutar el servidor, si no se está ejecutando, o simplemente...pasar a superagent de otra manera?

  • utilizar algo más, a continuación, superagent (como la petición, pero no estoy seguro si todas las cookies y node_tls_reject_unauthorized iba a funcionar.

Como Se puede ver - yo lucho con ese tema y tiene más preguntas que respuestas, y no lo suficiente experiancia para saber dónde mirar.

Amablemente os agradecería cualquier ayuda.

EDITAR:

He encontrado, que me puede hacer:

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

el que inicia la prueba en otro puerto, pero...todo server.js está cargado de todos modos, por lo que se inicia de todos modos también.Entonces, cuando la cocción junto con el funcionamiento del servidor, no es obvio EADDRINUSE.

¿Fue útil?

Solución

Cuando se utiliza superagent, usted siempre debe pasar una Expresa solicitud que ha sido configurado (middleware registrados, los controladores de enrutado, etc.)--pero no inicializado como un servidor HTTP.Eso es lo que hará para usted y va a aplazar, a través de http.createServer, para el sistema operativo de escoger a un puerto disponible.

Si actualmente usted tiene que el server.js módulo ya está proporcionando una instancia estática de un completo servidor HTTP, que es más probable que la fuente de sus problemas.En cualquier caso, intente extraer la configuración de la aplicación/arranque del sistema desde el servidor real de la creación de instancias como:

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

A continuación, en el análisis, se le puede hacer algo a lo largo de las líneas:

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

Esto es sólo para fines ilustrativos, donde el cuándo y cómo de crear instancias de la instancia de la aplicación dependerá de su prueba de contexto.Lo importante es que usted debe ser capaz de crear fresca, limpia, independiente y aislado instancias de servidor para los casos de prueba.Es una necesidad absoluta se debe utilizar una prueba de corredor que se ejecuta pruebas en paralelo o en un orden aleatorio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top