【问题标题】:Why are my tests failing and console.log() statements within a lodash method not logging?为什么我的测试失败并且 lodash 方法中的 console.log() 语句没有记录?
【发布时间】:2014-06-03 02:50:48
【问题描述】:

我有一些失败的测试在各种 lodash 方法上都被打破,但在浏览器中工作正常。在尝试调试时,我在回调参数中添加了一些 console.log()s 以查看发生了什么,但它们没有出现在测试中。在浏览器中运行的相同代码都可以正常工作并写入控制台。我怀疑破坏功能与丢失的日志语句有关。

这是一个 Angular 应用程序,我在其中提供 lodash 作为服务。

应用

app.value('_', window._);

app.service('myService', function(_) {
  return {
    filterNulls: function(obj) {
      // This logs correctly everywhere
      console.log(obj);

      return _.omit(obj, function(val, key) {
        // This logs in browsers but not in the Jasmine/Karma environment
        console.log('test');
        return val === null;
      });
    }    
  };
});

测试

describe('myService', function() {
  beforeEach(function() {
    module(function($provide) {
      $provide.value('_', window._);
    });
  });

  it('should strip nulls', inject(function(myService) {
    // FAILS because null value is not removed
    expect(myService.filterNulls({ 
        key: 'key1', 
        someProp: 'bar', 
        someOtherProp: null 
      }))
      .toEqual({ 
        key: 'key1', 
        someProp: 'bar'
      });
  });
});

【问题讨论】:

  • 在你的 karma conf 文件中是否包含 lodash 来加载?
  • 另外,从测试中,您调用 stripNulls 而在服务中只有一个名为 filterNulls 的函数,它返回三个值,而不是两个,给定您从测试。
  • 是的 Lodash 包括在内,这是为了简洁起见,这里是复制代码的错字。我试图澄清测试失败是因为空值没有被剥离。没有参考错误、未定义的函数等。我向您保证设置和语法是正确的。
  • 抱歉,来晚了,我错过了你的意思。

标签: javascript angularjs jasmine karma-runner lodash


【解决方案1】:

我不确定为什么 Karma 运行时没有显示您的日志 - 当我测试您的代码时它们会为我显示。可能还有另一个你或我不明显的问题。

我可以说您对_.omit 的使用不正确。来自the docs

回调绑定到 thisArg 并使用三个参数调用; (值、键、对象)。

同时,您的回调参数如下所示:

function(key, val) { .. }

这个微小的调整让我通过了你的测试:

function(val) { .. }

【讨论】:

  • 我复制的代码中有语法错误,抱歉。在我的实际代码中,key, val 参数正确。我看到你已经编辑了你的帖子几次,所以这个评论现在可能已经过时了,但是如果你在浏览器中运行它就可以了,所以我不认为这是我对 omit 函数的理解:_.omit({ foo: 'key1', bar: null }, function(val, key, obj) { return val === null; }); 它一定与我运行 lodash 的方式有关。感谢您的回答(以及您之前发布的测试结果)。
  • 我的第一个答案是 hackish - 我没有查看回调签名 - 只是调整了变量以使其工作。觉得这太懒了,我去看了文档,第二次做对了。抱歉,我无法帮助您解决问题。我只是在深入研究 Angular 测试,所以我认为值得我们俩看看我是否可以提供帮助。
  • 最好的学习方式!我已经解决了这个问题,我会在下面的答案中发布。
【解决方案2】:

原来问题是不正确的 lodash 引用。 karma.config 文件引用的版本 (lodash.underscore.js) 与应用程序 (lodash.compat.js) 不同。一个简单的协作开发不一致问题。

【讨论】:

  • 我实际上是想问你是否以某种方式加载了 Underscore 而不是 lodash! ... 因为 Underscore 的 _.omit 不接受回调,这可以解释为什么您在运行测试时看不到日志。很高兴你找到了它的底部。
猜你喜欢
  • 2020-03-23
  • 2012-09-16
  • 1970-01-01
  • 2014-05-16
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多