2014-11-20 2 views
1

문제는 아주 사소한 것처럼 보이기 때문에 나는 스스로 해결할 수 없다는 것을 당황스럽게 생각하지만 Google과 stackoverflow에서 많은 검색을 수행했습니다. 아무것도 아직 나를 도왔다. node.js가있는 RESTful 서버를 개발 중이며 API를 테스트하고 싶다. 서버가 비동기 적으로 초기화됩니다 (db에 연결하여 다른 서버에서 토큰을 요청해야 함 등).node.js + Express.js + mongodb 앱에서 mocha 테스트를 비동기식으로 시작하는 방법

{ 
    "name": "folserver", 
    "version": "0.0.0", 
    "description": "Server side for my app", 
    "main": "server.js", 
    "dependencies": { 
    ... 
    }, 
    "devDependencies": { 
    "mocha": "^2.0.1", 
    "should": "^4.3.0", 
    "supertest": "^0.15.0" 
    }, 
    "scripts": { 
    "test": "./node_modules/.bin/mocha --require should --reporter spec --ui bdd tests/tests.js", 
    "start": "server.js" 
    }, 
    "repository": "", 
    "author": "PainKiller", 
    "private": true 
} 
: 나는 "NPM 테스트"명령을 사용하여 명령 줄에서 테스트를 실행할 수 있도록 내 package.json 파일에서 스크립트 작업을 정의

var express = require('express'); 
var app = express(); 
var bodyParser = require('body-parser'); 
var MongoClient = require('mongodb').MongoClient; 
var bunyan = require('bunyan'); // logger 
var routes = require('./routes/folrouter.js'); 
var TokenGetter = require('./utils/tokengetter'); 


MongoClient.connect('mongodb://localhost:27017/fol', function (err, db) 
{ 
    if (err) 
     throw err; 

    global.db = db; 
    global.log = bunyan.createLogger({ 
      name : "folserver", 
      src : true, 
      serializers: bunyan.stdSerializers, 
      streams : [ { 
       path : 'folserver.log', 
       type : 'file' 
      } ] 
     }); 


    global.log.info("folserver starts..."); 
    var tg = new TokenGetter(); 
    tg.on("token_received", function(token){ 
     global.access_token = token; 
     global.log.info("access_token received: " + token); 
     //TO DO: compression and cache static content 
     app.use(express.static(__dirname + '/public')); 
     app.use(bodyParser.urlencoded({ extended: true })); 
     app.use(bodyParser.json()); 
     app.use('/api', routes); 
     app.listen(8080); 
     console.log('Express server listening on port 8080'); 
    }); 
    tg.getToken(); 

}); 

//only for tests!!! 
module.exports = app; 

: 그래서 내 server.js 파일의 코드는 다음과 같습니다 다음 코드

그리고 내가 가진 tests.js :

var should = require('should'); 
var request = require('supertest'); 
var app = require('../server.js'); 
describe("user.js", function() { 
    describe("#upsert()", function() { 
     it("should insert new user object correctly", function() { 
      before(function (done) { 
       console.log("before"); 
       request(app) 
       .post('api/user/upsert', user) 
       .set('Accept', 'application/json') 
       .end(function (error, res) { 
        done(); 
       }); 

      }); 

      after(function (done) { 
       //after 
       console.log("after"); 
       done(); 
      }); 

     }); 

     it("should update new user object correctly", function() { 
      //Test Goes Here 
     }); 
    }); 

    describe("#isregistered()", function() { 
     it("should return false on id not in db", function() { 
      //Test Goes Here 
     }); 

     it("should return true on id in db", function() { 
      //Test Goes Here 
     }); 
    }); 
}); 

첫 번째 문제 - 내 응용 프로그램을 테스트 한 후 완전히 초기화 시작 - 나는 "NPM 테스트"를 시작하고 때 나는 내 응용 프로그램에서 CONSOLE.LOG 출력과를 참조하십시오. 그리고 나는 나의 테스트가 콘솔에서 통과 된 것을 본다. (그들은 그 시점에서 아무 것도하지 않는다.하지만 그것은 지나쳤다.) 둘째 - 나는 콘솔에서 내 테스트의 콘솔 출력을 보지 못했다. 그리고 그것은 정말로 나를 괴롭힌다. 이 코드는 절대 실행되지 않습니까? 그러나 그것이 사실이라면 콘솔에서 테스트 한 결과를 어떻게 볼 수 있습니까?

두 가지 방법으로 해결할 수 있습니다. 우선 - 테스트를 시작하기 전에 지연 시키십시오, 나는 시도했습니다 - mocha와 함께 timeout 명령 - 도움이되지 않습니다. 지금까지 일정 기간 동안 JS 코드의 실행을 중지하는 적절하고 좋은 방법을 찾을 수 없습니다. 둘째 - 앱으로 이벤트를 내보내고 해당 이벤트에 대한 테스트를 시작하지만이 방법으로도 실패했습니다. 그리고 어쩌면 내가 뭔가 잘못되었거나, 그냥 보지 못했기 때문에 어떤 도움이나 의견을 주셔서 감사합니다. 미리 감사드립니다!

답변

0

그래서 마침내 테스트 전에 내 앱을 초기화하는 데 문제가 발생했습니다. 이것은 최종 코드입니다 :

var should = require('should'); 
var request = require('supertest'); 
var app = require('../server.js'); 

//this is root level hook with setTimeout do the trick 
before(function (done) { console.log("before all"); this.timeout(9000); setTimeout(done, 5000); }); 

describe("user.js", function() { 
    describe("#upsert()", function() { 
    before(function (done) { 
       console.log("before 2"); 
       this.timeout(5000); 
       var user = { test: "test" } 
       request(app) 
       .post('/api/user/upsert') 
       .set('Content-Length', JSON.stringify(user).length) 
       .set('Accept', 'application/json') 
       .send(user) 
       .end(function (error, res) { 
        if (error) throw error; 
        console.log(res); 
        done(); 
       }); 
       //done(); 
      }); 

     it("should insert new user object correctly", function (done) { 
      console.log("it"); 
      //console.log(app); 
      //console.log(global.db); 
      done(); 

     }); 
     after(function (done) { 
      console.log("after"); 
      done(); 
     }); 

     it("should update new user object correctly", function (done) { 
      //Test Goes Here 
      done(); 
     }); 
    }); 

    describe("#isregistered()", function (done) { 
     it("should return false on id not in db", function (done) { 
      //Test Goes Here 
      done(); 
     }); 

     it("should return true on id in db", function (done) { 
      //Test Goes Here 
      done(); 
     }); 
    }); 
}); 

모든 것이 비동기 적으로 작동하며 모든 콘솔 로그가 올바른 위치에 표시됩니다.

1

콜백 매개 변수가있는 호출 테스트 함수입니다.

편집 : 귀하의 케이스에서 후크를 재구성하십시오.

describe("#upsert()", function() { 

    var result; 

    before(function (done) { 
     console.log("before"); 
     request(app) 
     .post('api/user/upsert', user) 
     .set('Accept', 'application/json') 
     .end(function (error, res) { 

      result = res; 
      done(); 
     }); 

    }); 

     after(function (done) { 
      //after 
      console.log("after"); 
      done(); 
     }); 

    it("should insert new user object correctly", function() { 

     // assert "result" object here 
    }); 

    it("should update new user object correctly", function() { 
     //Test Goes Here 
    }); 
}); 

비동기 함수 내에 "before()"가 있었기 때문에. it()은 before()가 끝나기를 기다리지 않고 종료합니다. 비동기 함수를 외부에 배치하거나 비동기 함수로 호출()합니다.

+0

도움을 주셔서 감사합니다. 귀하의 조언을 구현하려고하는데, 내가 본 첫 번째 - 모든 로그 추적을 disapeared, 그리고 여전히 볼 수 없다 console.log 내 테스트에서. 무슨 뜻인지 알 수 없습니다. –

+0

그리고 서버 끝점이 여전히 작동하지 않습니다. 초기화되지 않았기 때문에 가정합니다. –

관련 문제