var myApp = angular.module('myApp', []);
describe('myApp', function () {
var element, rootScope;
beforeEach(module('myApp'));
it('does something', inject(function ($log) {
$log.log("this message gets eaten by angular-mocks");
console.log("this message is visible though");
}));
});
跳过第一条消息,第二条消息按预期显示。 为什么会使用这种奇怪的行为,除了不使用$ log之外还有什么方法可以修复它吗?
答案 0 :(得分:5)
模拟$ log服务旨在让您轻松测试和断言是否记录消息,具有讽刺意味的是,在运行测试时防止日志噪声到控制台。
如果您不喜欢这种行为,可以通过以下方式轻松更改:
$log.log = function(message){ console.log(message);};
备选方案您可以通过执行以下操作将所有先前记录的消息输出到控制台:
console.log($log.log.logs)
您可以在茉莉花之前或之后将这两种方法添加到全局中。
答案 1 :(得分:2)
根据dtabuenc的回答,我已经实施了解决方法 以全局形式转储失败的Jasmine测试的日志输出 afterEach():
afterEach(inject(function ($log) {
// dump log output in case of test failure
if (this.results().failedCount) {
var out = [];
angular.forEach(["log", "info", "warn", "error", "debug"], function (logLevel) {
var logs = $log[logLevel].logs;
if (!logs.length)
return;
out.push(["*** " + logLevel + " ***"]);
out.push.apply(out, logs);
out.push(["*** /" + logLevel + " ***"]);
});
if (out.length) {
console.log("*** logs for: " + this.description + " ***");
angular.forEach(out, function (items) { console.log.apply(console, items); });
}
}
$log.reset();
}));
不幸的是,没有替换angular-mocks的$ log实现 具有不同日志级别的消息的顺序丢失了,但我想 我将能够忍受这一点。沉默所有日志消息,包括 Angular在测试期间自己的错误和警告听起来仍然很糟糕 设计选择虽然。