Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检测console.log()调用_Javascript_Jquery_Tdd_Error Logging - Fatal编程技术网

Javascript 检测console.log()调用

Javascript 检测console.log()调用,javascript,jquery,tdd,error-logging,Javascript,Jquery,Tdd,Error Logging,我正在尝试为调试方法编写一个测试用例,该方法使用console.log()将消息写入JavaScript控制台。测试必须检查消息是否已成功写入控制台。我正在使用jQuery 是否有方法将钩子附加到控制台.log()或以其他方式检查消息是否已写入控制台,或关于如何编写测试用例的任何其他建议?控制台。log不会保留已记录消息的记录,也不会发出任何您可以侦听的事件。您的测试不可能直接从JavaScript验证其输出。相反,您的测试代码需要将console.log替换为一个mock实现,该实现会跟踪日志

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


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

控制台。log
不会保留已记录消息的记录,也不会发出任何您可以侦听的事件。您的测试不可能直接从JavaScript验证其输出。相反,您的测试代码需要将
console.log
替换为一个mock实现,该实现会跟踪日志消息以供以后验证

模拟是大多数JavaScript测试框架支持的一个常见特性。例如,它用模拟实现替换给定的方法,模拟实现在将每个调用的参数传递给原始实现之前记录这些参数。每次测试后,您可能希望调用以重置记录的参数列表,以便下次测试,或者使用

如果您没有使用测试框架(您可能应该),您可以自己创建一个简单的模拟


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

开始测试前-


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

运行测试后,如有必要-

console.log = originalLog

所以,解决方案不错,但如果你正在寻找一个高性能的记录器,试试Paul Irish的

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

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 );
}
用法


如果你用的是茉莉花,它非常简单:

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

前往了解更多信息。

Brilliant。很简单,但我不会想到。当您向
控制台.log
提供多个参数时,这不起作用,它会丢弃除第一个以外的所有参数。@nh2真的!修正了。或者,如果使用Jest(基本上是建立在Jasmine之上或之外),只需将
spyOn…
行替换为
console.log=Jest.fn()。如何检查日志中是否存在某些内容?

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

console.log = originalLog
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 );
}
console.log('I','have','an','important','message');
//Use native one instead
_log.call( console, _log.history );
it('is my test', function () {
    spyOn(console, 'log');
    // do your stuff that should log something
    expect(console.log).toHaveBeenCalledWith('something');
});