2012-06-10 5 views
15

mocha를 사용하여 독립 실행 형 테스트 슈트를 만들려고합니다. 완벽한 세상에서 내 express.js 응용 프로그램을 시작하고, 좀비를 사용하여 페이지를 렌더링하고, 묶음을 확인합니다. 그런 다음 teeownown/express.js 응용 프로그램을 종료하십시오.express.js 응용 프로그램을 mocha로 설정/해체

쉬운 방법/최선의 방법이 있습니까?

NB. 테스트를 실행하기 전에 명시 적으로 애플리케이션 서버를 실행할 수는 있지만, 면도하지 않으려면 Yaks가 무엇이 좋을까요.

+2

니스 질문 :

// use it in your mocha tests global.setupEnv = function setupEnv (o, before, after) { // just describe needed vars var env = Object.create(null); // setup before(function (next) { // create app env.app = expressApp(o); // creating listener with random port env.server = env.app.listen(function() { // store port when it ready port = env.server.address().port; env.app.log('Listening on ', env.port); // and go to tests next(); }); }); // teardown after(function() { // stop listening that port env.server.close(); }); return env; } 

그리고 당신의 테스트에서

.나는 나 자신을 잠시 보았다. 그러나 일주일 후 나는 방금 포기했다. 나는 좀비가 정말로 일하기가 짜증이났다. 나는 PhantomJS에 대해 많이 읽었지 만, 직접 시도하지는 않았다. – Pickels

답변

23

먼저 실제 앱 설정을 모듈로 옮긴 다음 실제로 앱을 시작하는 파일로 가져와야합니다. 이제는 별개이므로 앱을 실제로 듣기 전에 완전한 상태로 유지할 수 있습니다.

앱의 실제 설정을 별도의 파일로 옮기고 app.js라고 부르거나 노드를 실행 한 파일에서 수신자를 호출하여 index.js라고 부르 자고합니다.

var app = require('./app'); 

app.listen(3000, function(){ 
    console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env); 
}); 

이가 당신을 허용, 실제로는 듣지 않아도 앱 로딩을 seperates : 같을 것이다

var express = require('express') 
    , routes = require('./routes'); 

var app = module.exports = express.createServer(); 

// Configuration 

app.configure(function(){ 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

app.configure('production', function(){ 
    app.use(express.errorHandler()); 
}); 

// Routes 

app.get('/', routes.index); 

와하는 index.js :

그래서, app.js는 같을 것이다 그 단위 테스트에 해당 응용 프로그램을로드하십시오.

단위 테스트에서 설정 방법과 분해 방법으로 서버를 가져오고 내릴 수 있습니다. 파일 테스트/app_tests.js에서

:

describe('app', function(){ 
    var app = require('../app'); 
    beforeEach(function(){ 
    app.listen(3000); 
    }); 
    // tests here 
    afterEach(function(){ 
    app.close(); 
    }) 
}); 
+0

굉장! 하지만 필자의 경우 여러 개의 테스트 파일이 있으며 모카가 모든 파일을 동시에 실행하므로 테스트 파일간에 충돌이 발생합니다! 내가 무엇을 할 수 있을지 ? –

+0

각 포트를 다른 포트에서 수신 대기 - 임의의 번호 만 선택하십시오 (충분히 높음) –

+0

뛰어난 솔루션! 이것이 올바른 방법입니다. 하나의 수정 : 당신은 실제로 응용 프로그램 자체가 아니라 app.listen의 결과를 닫아야합니다. (beforeEach에서) "instance = app.listen (3000);" ... 그리고 나서 (afterEach에서) "instance.close()" –

4

Oved D 응답뿐만 아니라.

특급 - app.js 또는 다른 파일에 응용 프로그램을 설명 :

module.exports = function (o) { 
    o = o || {}; 
    var app = express(); 

    // app.configure 
    // configure routes 
    if (o.someOption) { 
    // some additional test code 
    } 

    return app; 
} 

테스트/01-some.js에서 테스트를 설명 :

var expressApp = require('../express-app'); 
describe('some', function() { 

    // just describe needed vars 
    var app, server, port; 

    // describe setup 
    before(function (next) { 
    // create app when 
    app = expressApp({routes: /api\/some\/.*/ /* put here some test options ...*/}); 
    // creating listener with random port 
    server = app.listen(function() { 
     // store port when it ready 
     port = server.address().port; 
     // and go to tests 
     next(); 
    }); 
    }); 

    // tests 
    it('should return valid result', function (done) { 
    // do a simple request to /api/some 
    http.request({ 
     host: 'localhost', 
     port: port, 
     path: '/api/some' 
    }, function (res) { 
     if (res.err) throw new Error(res.err); 
     done(); 
    }); 
    }); 

    // teardown 
    after(function() { 
    // stop listening that port 
    server.close(); 
    }); 

}); 

을 완료합니다. ;-)

이제 모든 테스트를 만들 수 있습니다. params를 express-app.js 모듈에 전달하여 정의 된 테스트에서 필요한 URL과 서비스 만 사용하도록 설정하는 것이 좋습니다.


업데이트 :

init.jsbeforeafter 통화를 이동하고 mocha --require init.js와 함께로드 mocha하지만 더 나은 어떻게 작동하는지 확실하지. 해야 그 모양

파일 :

// requiring dependencies 
var request = require('request'); 

describe('api', function() { 

    // describe setup 
    var env = global.setupEnv({ 
      routes: 'api/some' 
     }, before, after); 

    // tests 
    it('should pass', function (done) { 
     request('http://localhost:' + env.port, function (error, response, body) { 
      done(); 
     }); 
    }); 

});