jasmine-node를 이용한 nodejs test
설치
다음 npm package를 설치해서 처리한다.
sudo npm install -g jasmine-node
Application의 구성
기본적으로 yo에서 제공되는 application 구조를 그대로 가지고 가는 것이 좋다. (express application을 기준)
.
├── Gruntfile.js
├── app
│ └── lib
├── app.js
├── npm-debug.log
├── package.json
└── test
└── calculator-spec.js
test code의 실행
일반적으로 root directory에서 다음 명령어를 이용해서 처리하면 된다.
jasmine-node --test-dir test --autotest --watch app test --color
simple test code
target이 되는 file의 위치가 app/lib/testservice.js
라고 할때, export되는 객체는 다음과 같이 구성될 수 있다.
exports.method1 = function() {
return true;
};
exports.method2 = function() {
return false;
};
javascript는 method 단위의 구성을 주목할 필요가 있다.
이때, 이 method1, method2를 test하는 code는 다음과 같이 작성가능하다.
var testservice = require('../app/lib/testservice.js');
describe('test testservice', function() {
it('method1 called', function() {
expect(testservice.method1()).toBe(true);
});
it('method2 called', function() {
expect(testservice.method2()).toBe(false);
});
});
simple test code 2
만약에 db를 접속해서 만들어지는 BL이 존재한다면 다음과 같이 구성한다. yo express-generator에서는 db connection이 app.js에서 구성되는데, 이를 따로 뽑아서 사용하면 db에 대한 service code test가 쉽다.
mongoDb에 접근하는 코드는 다음과 같다.
var mongoose = require('mongoose'),
glob = require('glob'),
path = require('path'),
rootPath = path.normalize(__dirname + '/..');
var init = function() {
mongoose.connect('mongodb://localhost/sadari');
var db = mongoose.connection;
db.on('error', function() {
throw new Error('unable connect to database');
});
//glob.sync는 absolute directory를 기준으로 검색하기 때문에 반드시 path에 대한 정보가 필요하다.
var models = glob.sync(rootPath + '/models/*.js');
models.forEach(function(model) {
require(model);
});
};
exports.init = init;
위와 같은 db connection을 이용하는 간단한 CRUD service를 작성할 때, code는 다음과 같이 구성될 수 있다.
var mongoose = require('mongoose');
var Player = mongoose.model('Player');
var ObjectId = mongoose.Types.ObjectId;
var findAll = function(func) {
return Player.find(function(err, players) {
if(func) {
func(players);
}
});
};
var save = function(name, defaultAmount) {
var player = new Player({
name: name,
defaultAmount: defaultAmount
});
return player.save(function(err) {
throw new Exception(err);
});
};
var findOne = function(id, func) {
var objectId = mongoose.Types.ObjectId(id);
Player.findById(objectId, func);
};
var find = function(query, func) {
Player.find(query, func);
};
var update = function(id, name, defaultAmount, func) {
var objectId = mongoose.Types.ObjectId(id);
Player.update(
{_id: objectId},
{
$set: {
name: name,
defaultAmount: defaultAmount
}
}, { upsert: false, multi: true }, func);
};
exports.update = update;
exports.findOne = findOne;
exports.findAll = findAll;
exports.save = save;
exports.find = find;
이에 대한 test code는 다음과 같다.
var dbConnection = require('../app/lib/db-connect.js');
dbConnection.init();
var playerService = require('../app/lib/playerservice.js');
describe('mongoDb test', function() {
it('playerService.findAll', function(done) {
var conn = playerService.findAll(function(players) {
expect(players.length).not.toBe(0);
players.forEach(function(player) {
expect(player.defaultAmount).not.toBe(0);
});
done();
});
expect(!!conn).toBe(true);
});
it('playerService.save', function() {
var result = playerService.save('playerName', 10);
expect(result).not.toBe(null);
});
it('playerService.find', function(done) {
playerService.find({}, function(err, players) {
expect(players.length).toBe(1);
players.forEach(function(player) {
console.log(player.name);
});
done();
});
});
it('playerService.findOne', function(done) {
var id = "5469751de83eaf6e34434c5e";
playerService.findOne(id, function(err, player) {
console.log(err);
expect(!!err).toBe(false);
expect(player).not.toBe(null);
console.log(player);
console.log(player.name);
done();
});
});
it('playerService.update', function(done) {
var id = "5469751ae83eaf6e34434c55";
playerService.update(id, "changedName2", 100, function(err, model) {
expect(!!err).toBe(false);
done();
});
});
it('players list', function(done) {
var mongoose = require('mongoose');
var Player = mongoose.model('Player');
var playersResult = null;
Player.find(function(err, players) {
expect(players.length).not.toBe(0);
players.forEach(function(p) {
expect(p.defaultAmount).not.toBe(0);
});
done();
});
});
});
Posted by Y2K