【问题标题】:Testing a flatiron cli app with Mocha: app.log is undefined?使用 Mocha 测试 flatiron cli 应用程序:app.log 未定义?
【发布时间】:2012-03-17 13:15:16
【问题描述】:

我在测试 flatiron cli appMocha 时遇到问题。

我想测试的命令行命令创建一个目录并使用 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不适用于 Mocha?

这是因为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'

或者在这种情况下,您会使用带有sinon.js 之类的东西的间谍/存根/模拟来以某种方式模拟 app.log 的行为?因为我不关心日志记录是否有效,但是否创建了目录。

【问题讨论】:

    标签: javascript testing bdd mocha.js flatiron.js


    【解决方案1】:

    好的,我知道了。

    使用 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(); 
    

    使用 flatiron 日志插件 winston 调用 app.init() sets up logging

    但您可以在测试中调用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');
        });
      });
    });
    

    Mocha 甚至负责记录:

      Flatiron command
        #create()
          ◦ should create a directory : info: Directory created!
          ✓ should create a directory  (48ms)
    
    
      ✔ 1 tests complete (50ms)
    

    如果您想停止记录,可以在调用app.init() 后使用app.log.loggers.default.remove(winston.transports.Console)。您必须要求 winston 执行此操作。

    【讨论】:

    • #init() 方法来自 Broadway。您必须初始化 Broadway 应用才能获得依赖注入功能。
    猜你喜欢
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    相关资源
    最近更新 更多