在我的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;
答案 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: [] }