我一直在尝试运行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);
}
答案 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({});