2012-03-17 2 views
1

У меня проблемы с тестированием flatironcli app с Mocha.Тестирование приложения cli-приложения с моккой: app.log не определено?

Команда командной строки, которую я хочу протестировать, создает каталог и регистрирует успех с помощью app.log.info.

Это код для тестирования (./lib/commands/create.js):

var flatiron = require('flatiron'), 
    app = flatiron.app, 
    fs = require('fs'), 
    path = require('path'); 

module.exports = function create(name, callback) { 
    "use strict"; 
    fs.mkdir('./' + name); 
    app.log.info('Directory created!'); 
} 

Это испытание (./test/create.js):

var create = require('../lib/commands/create'); 

describe('Flatiron command', function() { 
    "use strict"; 
    describe('#create()', function() { 
    it('should create a directory ', function() { 
     create('someDirectory'); 
     // check if the directory was created, 
     // then remove the directory 
    }); 
    }); 
}); 

mocha test/log -R spec дает мне

Flatiron command 
    #log() 
     1) should log something 


    ✖ 1 of 1 tests failed: 

    1) Flatiron command #create() should create a directory : 
    TypeError: Cannot call method 'info' of undefined 

Почему app.log не доступны мокко?

Это из-за того, как function log экспортируется?

Или это как-то связано с тем, как утюг устанавливает приложение? Я пытался требовать flatiron.app и запустить его из теста, как этот

var create = require('../lib/commands/create'), 
    flatiron = require('flatiron'), 
    app = flatiron.app; 

describe('Flatiron command', function() { 
    "use strict"; 
    describe('#create()', function() { 
    it('should create a directory ', function() { 
     app.start(); 
     create('someDirectory'); 
    }); 
    }); 
}); 

- но без успеха, только другая ошибка:

Flatiron command 
    #create() 
     1) should create a directory 


    ✖ 1 of 1 tests failed: 

    1) Flatiron command #create() should create a directory : 
    TypeError: Object [object Object] has no method 'start' 

Или это тот случай, когда вы будете использовать шпионов/stubs/mocks с чем-то вроде sinon.js, чтобы каким-то образом имитировать поведение app.log? Потому что мне неинтересно, работает ли журнал, но если каталог создан.

ответ

1

Хорошо, у меня это есть.

Использование app.start() было не совсем таким - но оно работает с app.init(). В утюга, app.init() обычно вызывается из основного файла, вставив flatiron.plugins.cli в app.use() так:

var flatiron = require('flatiron'), 
    path = require('path'), 
    app = flatiron.app; 

app.config.file({ file: path.join(__dirname, '..', 'config', 'config.json') }); 

app.use(flatiron.plugins.cli, { 
    dir: path.join(__dirname, '..', 'lib', 'commands'), 
    usage: 'Empty Flatiron Application, please fill out commands' 
}); 
app.start(); 

Вызов app.init()sets up logging с winston, Флэшерон лесозаготовительной плагин.

Но вы можете позвонить app.init() из теста без звонка app.start() после него. Так это работает:

var create = require('../lib/commands/create'), 
    flatiron = require('flatiron'), 
    app = flatiron.app; 

describe('Flatiron command', function() { 
    "use strict"; 
    describe('#create()', function() { 
    it('should create a directory ', function() { 
     app.init(); 
     create('someDirectory'); 
    }); 
    }); 
}); 

мокко даже заботится о протоколирования:

Flatiron command 
    #create() 
     ◦ should create a directory : info: Directory created! 
     ✓ should create a directory (48ms) 


    ✔ 1 tests complete (50ms) 

Если вы хотите, чтобы остановить регистрацию, вы можете использовать app.log.loggers.default.remove(winston.transports.Console) после того как вы называли app.init(). Для этого вам понадобится winston.

+0

Метод #init() поступает из Бродвея. Вы должны инициализировать приложения Broadway, чтобы получить функции впрыска зависимостей. – srquinn