我正在尝试编写一个调试方法的测试用例,该方法使用console.log()
将消息写入JavaScript控制台。测试必须检查消息是否已成功写入控制台。我正在使用jQuery。
有没有办法将挂钩附加到console.log()
或以其他方式检查是否已将消息写入控制台,或者有关如何编写测试用例的任何其他建议?
答案 0 :(得分:17)
console.log
不会记录已记录的消息,也不会发出您可以侦听的任何事件。您的测试无法直接验证JavaScript的输出。相反,您的测试代码需要将console.log
替换为模拟实现,该实现会跟踪日志消息以供日后验证。
Mocking是大多数JavaScript测试框架支持的常见功能。例如,the Jest test framework provides a jest.spyOn
function使用模拟实现替换给定方法,该模拟实现在将每个调用传递给原始实现之前记录每个调用in a .mock
property的参数。每次测试后,您可能需要调用jest.clearAllMocks()
重置下次测试的录制参数列表,或使用the equivalent clearMocks: true
config option。
function saySomething() {
console.log("Hello World");
}
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();
});
如果你没有使用测试框架(你可能应该),你可以自己创建一个简单的模拟。
function saySomething() {
console.log("Hello World");
}
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;
}
}
答案 1 :(得分:9)
所以解决方案也不错,但如果您正在寻找高功率记录器,请尝试Paul Irish的log()
如果功率过高,你就可以得到类似的东西。
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 );
答案 2 :(得分:8)
如果你正在使用Jasmine,那就简单了:
it('is my test', function () {
spyOn(console, 'log');
// do your stuff that should log something
expect(console.log).toHaveBeenCalledWith('something');
});
前往Jasmine docs获取更多信息。
答案 3 :(得分:5)
只需将自己的功能附加到console.log即可。 在您的页面上,加载完所有后,
在开始测试之前 -
var originalLog = console.log;
console.log = function(msg){
alert('my .log hook received message - '+msg);
//add your logic here
}
运行测试后,如有必要 -
console.log = originalLog