为什么$ log总是被角度模拟器沉默?

时间:2013-12-09 23:33:20

标签: angularjs testing logging mocking

对于AngularJS应用程序,建议在console.log上使用$ log服务。此类日志记录的一个常见用例是在运行测试时看到调试打印。问题是,angular-mocks默认静音$ log,用模拟替换它。好吧,我有时需要测试我的调试打印,但我只需要经常看到它。问题是,默认行为坚持使用虚拟日志记录,我甚至没有看到恢复真实$ log的正确方法。我做了一个jsfiddle示例来说明它,尝试运行它,同时查看devtools控制台http://jsfiddle.net/ivan4th/EnvL9/

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之外还有什么方法可以修复它吗?

2 个答案:

答案 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在测试期间自己的错误和警告听起来仍然很糟糕 设计选择虽然。