Тестирование приложения flatiron cli с Mocha: app.log не определен? - PullRequest
1 голос
/ 17 марта 2012

У меня проблемы с тестированием flatiron cli app с Mocha .

Командой командной строки, которую я хотел быtest создает каталог и регистрирует успех с 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 настраивает приложение?Я попытался потребовать 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'

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

1 Ответ

1 голос
/ 18 марта 2012

Хорошо, я понял.

Использование app.start() было не совсем так - но оно работает с app.init().Во flatiron 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() устанавливает ведение журнала с помощью winston , плагин для ведения журнала flatiron.

Но вы можете вызвать 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().Для этого вам нужен Уинстон.

...