在MOCHA测试框架中模拟console.log()/任何其他函数

时间:2016-05-05 06:22:16

标签: javascript mocking mocha sinon

我正在为NODE JS API编写测试用例。但是在NODE JS File的路由或服务中console.log()存在的任何地方,都会打印到CLI。有没有办法模拟这些,以便这些不会在CLI中打印出来。

我已经探索了几个像Sinon,Stub这样的库来进行嘲弄。但无法掌握这些图书馆的工作。

4 个答案:

答案 0 :(得分:0)

您可以完全覆盖功能:setVisible

答案 1 :(得分:0)

你可以按照将这些前/后块添加到测试中的方法做一些事情,但问题是mocha实际上使用console.log来打印关于测试结果的漂亮消息,所以你会失去那些< / p>

describe('Test Name', function() {
  var originalLog;
  beforeEach(function() {
    originalLog = console.log;
    console.log = function () {};
  });
  // test code here
  afterEach(function() {
    console.log = originalLog;
  })
})

问题是您的输出看起来像

  Test Name


  X passing (Yms)

没有任何中间文字

答案 2 :(得分:0)

您不应该尝试模拟console.log本身,更好的方法是让您的节点模块获取日志记录对象。这允许您在测试期间提供替代(即模拟)。例如:

<my_logger.js>
module.exports = {
    err: function(message) {
        console.log(message);
    }
}

<my_module.js>
var DefaultLogger = require('my_logger.js');

module.exports = function(logger) {
    this.log = logger || DefaultLogger;
    // Other setup goes here
};

module.exports.prototype.myMethod = function() {
    this.log.err('Error message.');
};

<my_module_test.js>
var MyModule = require('my_module.js');

describe('Test Example', function() {
    var log_mock = { err: function(msg) {} };

    it('Should not output anything.', function() {
        var obj = new MyModule(log_mock);
        obj.myMethod();
    });
});

这里的代码我简化了,因为实际测试不是这个例子的原因。仅仅是插入替代日志记录。

如果你有一个包含大量console.log调用的大型代码库,那么在为每个方法添加测试时,最好只更新代码。以这种方式使您的日志记录可插入使您的代码更容易,更容易接受测试。此外,还有许多可用于节点的日志记录框架。 console.log在开发期间很好,只是想要转出一些东西来看看发生了什么。但是,如果可能的话,尽量避免将其用作日志记录解决方案。

答案 3 :(得分:0)

我找不到隐藏要测试的模块中console.log次调用的解决方案,并模拟测试框架调用的 none (在我的情况下是摩卡/柴)。

我想出了在应用代码中使用console的副本:

/* console.js */
module.exports = console;

/* app.js */
const console = require('./console');
console.log("I'm hidden in the tests");

/* app.spec.js */
const mockery = require('mockery');
var app;

before(() => {
  // Mock console
  var consoleMock = {
    log: () => {}
  }
  mockery.registerMock('./console', consoleMock);
  // Require test module after mocking
  app = require('./app');
});

after(() => {
  mockery.deregisterAll();
  mockery.disable();
});

it('works', () => {});