检测console.log()调用

JJJ*_*JJJ 7 javascript tdd jquery error-logging

我正在尝试编写一个测试用例,用于将消息写入JavaScript控制台的调试方法console.log().测试必须检查消息是否已成功写入控制台.我正在使用jQuery.

有没有办法附加一个钩子console.log()或以其他方式检查是否已将消息写入控制台,或者有关如何编写测试用例的任何其他建议?

小智 18

您可以console.log使用自己的函数替换,该函数确定是否已正确调用它.以下是如何确认函数记录特定消息的示例:

function saySomething() {
  console.log("Hello World");
}
Run Code Online (Sandbox Code Playgroud)

示例用法

jest.spyOn(console, 'log');

test("saySomething says hello", () => {
  expect(console.log.mock.calls.length).toBe(0);
  saySomething();
  expect(console.log.mock.calls.length).toBe(1);
  expect(console.log.mock.calls[0][0]).toBe("Hello World");
});

afterEach(() => {
  jest.clearAllMocks();
});
Run Code Online (Sandbox Code Playgroud)

function saySomething() {
  console.log("Hello World");
}
Run Code Online (Sandbox Code Playgroud)

function testSomething() {
  // Replace console.log with stub implementation.
  const originalLog = console.log;
  const calls = [];
  console.log = (...args) => {
    calls.push(args);
    originalLog(...args);
  };

  try {
    console.assert(calls.length == 0);
    saySomething();
    console.assert(calls.length == 1);
    console.assert(calls[0][0] == "Hello World");
  } catch (error) {
    console.error(error);
  } finally {
    // Restore original implementation after testing.
    console.log = originalLog;
  }
}
Run Code Online (Sandbox Code Playgroud)

function saySomething() {
  console.log("Hello World");
}
Run Code Online (Sandbox Code Playgroud)


Dre*_*rew 9

所以不错的解决方案,但如果你正在寻找一个高功率记录器尝试保罗爱尔兰的日志()

如果它的功率太大,你可以用这样的东西.

var console = window.console,
    _log = console ? console.log : function(){};

_log.history = [];

console.log = function( ){
  _log.history.push.apply( _log.history, arguments );
  _log.apply( console, arguments );
}
Run Code Online (Sandbox Code Playgroud)

用法

console.log('I','have','an','important','message');
//Use native one instead
_log.call( console, _log.history );
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/BeXdM/


mik*_*1aj 8

如果你正在使用Jasmine,它很简单:

it('is my test', function () {
    spyOn(console, 'log');
    // do your stuff that should log something
    expect(console.log).toHaveBeenCalledWith('something');
});
Run Code Online (Sandbox Code Playgroud)

前往Jasmine docs获取更多信息.


Amo*_*are 5

只需将您自己的函数附加到console.log即可.在您的页面上,在所有加载后,

在开始测试之前 -


var originalLog = console.log;
console.log = function(msg){
  alert('my .log hook received message - '+msg); 
  //add your logic here
}

Run Code Online (Sandbox Code Playgroud)

运行测试后,如有必要 -

console.log = originalLog
Run Code Online (Sandbox Code Playgroud)