期望null({})等于Object({})

时间:2016-03-01 06:05:03

标签: javascript angularjs jasmine karma-jasmine angular-resource

我一直在尝试运行AngularJS自己的$ resource单元测试。唯一的区别是我用Jasmine v2.0和Karma v0.13运行 我完成了将自定义操作从较旧的Jasmine转换为更新的所有工作,因此所有测试都通过了。好吧几乎所有......

我偶然发现了一种类型的测试。我相信它有事可做$httpBackend。在测试this line时,我发现它失败了:

Expected null({ }) to equal Object({ }).

实际测试代码,问题是最新的期望:



      // ---
      callback = jasmine.createSpy();
      // ---

      it("should create resource", function() {
        $httpBackend.expect('POST', '/CreditCard', '{"name":"misko"}').respond({id: 123, name: 'misko'});

        var cc = CreditCard.save({name: 'misko'}, callback);
        expect(cc).toEqualData({name: 'misko'});
        expect(callback).not.toHaveBeenCalled();

        $httpBackend.flush();
        expect(cc).toEqualData({id: 123, name: 'misko'});
        expect(callback).toHaveBeenCalledOnce();
        expect(callback.calls.mostRecent().args[0]).toEqual(cc);
        expect(callback.calls.mostRecent().args[1]()).toEqual({});
      });




更新

找到它。
结果,角度使用函数以创建空对象。可能最新版本的Jasmine在调用使用null{}实例化的对象时失败。

/**
 * Creates a new object without a prototype. This object is useful for lookup without having to
 * guard against prototypically inherited properties via hasOwnProperty.
 *
 * Related micro-benchmarks:
 * - http://jsperf.com/object-create2
 * - http://jsperf.com/proto-map-lookup/2
 * - http://jsperf.com/for-in-vs-object-keys2
 *
 * @returns {Object}
 */
function createMap() {
  return Object.create(null);
}

2 个答案:

答案 0 :(得分:1)

在查看AngularJS源代码后,我发现有时会使用Object.create(null)创建对象,就像下面的代码段一样。

/**
 * Creates a new object without a prototype. This object is useful for lookup without having to
 * guard against prototypically inherited properties via hasOwnProperty.
 *
 * Related micro-benchmarks:
 * - http://jsperf.com/object-create2
 * - http://jsperf.com/proto-map-lookup/2
 * - http://jsperf.com/for-in-vs-object-keys2
 *
 * @returns {Object}
 */
function createMap() {
  return Object.create(null);
}

看起来Jasmine 2.0也增加了原型类型的比较,因此期望失败。

测试可以这样写:expect(callback.calls.mostRecent().args[1]()).toEqual(Object.create(null));,因为它会通过。

答案 1 :(得分:0)

我认为您的代码中有一个备用()。转换它;

expect(callback.mostRecentCall.args[1]()).toEqual({});

expect(callback.mostRecentCall.args[1]).toEqual({});