通过the $resource
service in the ngResource
module创作AngularJS资源工厂时,操作方法的返回值是具有其他属性$promise
和$resolve
的对象。剥离或忽略这些属性的首选方法是什么,以便可以使用the Jasmine toEqual(..)
matcher将它们与样本数据进行比较?
例如,我的规格可能如下:
describe('the #query() action method', function() {
var mockData;
beforeEach(function() {
mockData = [1, 2, 3];
$httpBackend.when('GET', '/foo').respond(200, JSON.stringify(mockData));
});
it('returns the mock data', function() {
var queryData = MyResource.query();
$httpBackend.flush();
expect(queryData).toEqual(mockData);
// ^-- Fails since "queryData" has properties $resource and $resolve.
});
});
目前我正在通过在调用匹配器之前插入以下行来解决这个问题,但这感觉就像一个kludge:
queryData = JSON.parse(JSON.stringify(queryData));
是否有更好/首选的方法来比较承诺数据,忽略添加的属性?
答案 0 :(得分:4)
解决此问题的一个好方法是添加匹配器。例如:
beforeEach(function(){
this.addMatchers({
toEqualData: function(expected) {
return angular.equals(this.actual, expected);
}
});
});
angular.equals在比较对象时忽略函数。 现在你可以使用:
expect(queryData).toEqualData(mockData);
可以找到这个确切解决方案的完整说明here