【问题标题】:Karma/Jasmine spec -- Expected { } to equal { }Karma/Jasmine 规范 -- 预期 { } 等于 { }
【发布时间】:2014-10-14 07:22:42
【问题描述】:

我正在运行 Karma 规范来测试 Egghead.io 教程中概述的模型的 Angular BaseClass 的功能。

该行为似乎有效,但我遇到了一个奇怪的错误:

PhantomJS 1.9.7 (Mac OS X) BCCache adds a cache to the model FAILED
  Expected {  } to equal {  }.
  Error: Expected {  } to equal {  }.

What I could find of this error(很难搜索,考虑到字符——表明toEqual 应该能够识别这两个对象的等价性——所以我有点难过。

这是规范代码(coffeescript):

describe 'BCCache', ->
  it "adds a cache to the model", ->
    expect(Post.cached).toEqual({})

这是它正在测试的内容:

base.coffee

angular.module("BaseClass")
  .factory "BCBase", ['BCCache', (Cache) ->
    Base = (attributes) ->
      _constructor = this
      _prototype = _constructor.prototype

      _constructor.cached = new Cache()

    return Base
  ]

cache.coffee

angular.module('BaseClass')
  .factory 'BCCache', -> 
    Cache = ->    
    return Cache

规范基本上断言cached 方法(当前)返回一个新的空对象,cache.coffee 文件似乎成功地做到了。但不知何故,Karma 并不认为这两个空对象是等价的。知道为什么吗?我有点难过。

【问题讨论】:

  • 2 个对象只有当它们的引用相同时才相等。
  • @PSL 这不是骗子,这是 Jasmine 问题。 toEqual 应该在这种情况下工作:groups.google.com/forum/#!topic/jasmine-js/INma5VrV2Xs
  • @PSL 不,不是。 toEqual 不是 ===。它遍历一个对象并检查属性。
  • @Sasha 因为第一个对象的构造函数是 Cache 而第二个不是。所以它没有达到预期。 var aCtor = a.constructor, bCtor = b.constructor; if (aCtor !== bCtor && !(isFunction(aCtor) && (aCtor instanceof aCtor) && isFunction(bCtor) && (bCtor instanceof bCtor))) { return false; }。所以将你的比较设置为expect(Post.cached).toEqual(new Cache())
  • 要添加到@PSLs 答案,等于github.com/pivotal/jasmine/blob/master/src/core/matchers/… 的来源显示了所描述的行为。检查第 143 行。请注意,如果您有 expect({}).toEqual({}),那将起作用。错误信息有点误导。

标签: javascript angularjs phantomjs karma-runner karma-jasmine


【解决方案1】:

Post.cachedCache 的一个实例,而您的{} 只是一个无聊的Object。 Jasmine 认为使用不同的构造函数是导致 toEquals 比较失败的正当理由。

如果你想检查上面的相等性,你可以这样做:

var mockCache = new Cache();
expect(Post.cached).toEqual(mockCache);

或者,您可以只检查它是否为空对象:

expect(Object.keys(Post.cached).length).toBe(0);

感谢 Jeff Storey 提供代码链接:https://github.com/pivotal/jasmine/blob/master/src/core/matchers/matchersUtil.js#L143

【讨论】:

  • @PSL 是的,原来问题是对 Jasmine 的 toEqual 一直有误解。
  • 这就是我在问题中评论的内容,回到您的答案.. :D,也许我可以在没有评论和澄清的情况下回答.. 大声笑.. 呵呵,这是一个竞争环境.. :D
  • 谢谢大家!这很有趣。
  • @sasha 是的。但我认为这应该由 jeff storey 或我自己回答......因为我们没有争论 jasmine 是错误的,而是调查并粘贴了导致答案的相关部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 2021-05-20
  • 2014-10-14
  • 2015-12-20
  • 1970-01-01
相关资源
最近更新 更多