簡體   English   中英

grunt測試api與supertest,express和mocha

[英]grunt testing api with supertest, express and mocha

我有一個運行快遞的https服務器,我用mocha和supertest測試。

我的問題是 - 如果我只運行測試 - 它確定。 如果我嘗試運行帶有測試的gruntfile然后運行express - 我看到很多EADDRINUSE錯誤,即使在測試文件中我用app.close()做后()。 同樣適用於測試中的觀察任務。

這是我的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();
            });
        });
    });

}());

我知道那些測試遠非完美。 我只是通過適當的軟件測試開始我的冒險。

所有那些“已經在使用的港口”都很明顯,而且沒有一個......給出任何問題。 所有測試工作正常,服務器工作正常,但stdout很瘋狂。 這種行為遠非理想,可能充滿了潛在的問題和不穩定性問題。

我的問題是 - 如何擺脫它?

我的想法是:

  • 創建專用服務器以便在不同的端口上進行測試 不幸的是,我必須弄清楚如何實現這一點。

  • 如果沒有運行服務器,請為superagent運行一些條件,或者只是...將其傳遞給superagent否則?

  • 使用其他東西然后superagent(如請求,但我不知道所有的cookie和node_tls_reject_unauthorized是否會起作用。

正如你所看到的 - 我對這個話題很掙扎,並且有更多的問題而不是答案,而且沒有足夠的經驗來知道在哪里看。

我很感激任何幫助。

編輯:

我發現,我能做到:

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

它開始在另一個端口上測試但是...整個server.js無論如何都被加載,所以它也開始了。 然后,當它與運行的服務器一起啟動時,顯然有EADDRINUSE。

使用superagent ,您應該始終傳遞一個已配置的Express應用程序(中間件已注冊,控制器路由等) - 但未初始化為HTTP服務器。 它會為你做這件事,它會通過http.createServer推遲到OS來選擇一個可用的端口。

如果您當前擁有server.js模塊已經提供了一個完整的HTTP服務器的靜態實例,那很可能是您的問題的根源。 在任何一種情況下,嘗試從實際的服務器實例化中提取應用程序配置/ bootstrapping,如下所示:

// 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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM