如何使用AngularJS承诺数据的toEqual(...)?

时间:2014-09-05 14:38:55

标签: angularjs jasmine

通过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));

是否有更好/首选的方法来比较承诺数据,忽略添加的属性?

1 个答案:

答案 0 :(得分:4)

解决此问题的一个好方法是添加匹配器。例如:

  beforeEach(function(){
    this.addMatchers({
      toEqualData: function(expected) {
        return angular.equals(this.actual, expected);
      }
    });
  });

angular.equals在比较对象时忽略函数。 现在你可以使用:

expect(queryData).toEqualData(mockData);

可以找到这个确切解决方案的完整说明here