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');
});