我可以在NodeJs中模拟控制台吗?

时间:2015-04-06 10:08:04

标签: javascript node.js testing console mocking

在我的JS测试中,我需要检查是否调用了console.info。这就是我想模仿控制台的原因。但是,似乎无法为控制台变量分配不同的对象。我犯了什么错误吗?

以下是我使用的代码:

var oldConsole = console;
var infoContent;
console = {
  info: function(content) {
    infoContent = content;
  }
};

game.process('a command');
infoContent.should.equal('a command is processed');
console = oldConsole;

4 个答案:

答案 0 :(得分:4)

您可以使用rewire替换整个控制台以使其静音,或者注入模拟。我使用deride但是sinon也可以使用。

var rewire = require('rewire');
var deride = require('deride');
var Game = rewire('../lib/game');

describe('game testing', function() {
  var stubConsole, game;
  beforeEach(function() {
    stubConsole = deride.stub(['info']);
    stubConsole.setup.info.toReturn();
    Game.__set__({
      console: stubConsole
    });
    game = new Game();
  });

  it('logs info messages', function() {
    game.process('a command');
    stubConsole.expect.info.called.withArgs(['a command is processed']);
  });
});

答案 1 :(得分:1)

我找到了解决方案。我可以改变控制台的方法信息。

console.info = function(content) {
  infoContent = content;
};

现在的问题是为什么无法重新分配控制台对象本身?

答案 2 :(得分:0)

您可以使用sinon npm计算对函数的调用:

it("calls the original function only once", function () {
    var callback = sinon.spy();
    var proxy = once(callback);

    proxy();
    proxy();

    assert(callback.calledOnce);
    // ...or:
    // assert.equals(callback.callCount, 1);
});

您可以在此处找到文档:sinonjs.org

答案 3 :(得分:0)

我认为我遇到了同样的问题,我的解决方案是使用这个std-mocks模块:

这样做的好处是不会接管全球"控制台"但是允许您查看记录到stdout / stderr的内容。这解决了问题的方式与问题明确寻找的方式不同;但是我相信这个问题意味着问题是一个很好的答案,可能对其他人有用。

const stdMocks = require('std-mocks');
stdMocks.use(); console.log('test'); stdMocks.restore();
// => undefined [nothing gets output, stdout intercepted]
const logged = stdMocks.flush();
console.log(logged)
// => { stdout: [ 'test\n' ], stderr: [] }