Javascript AngularJS Karma测试规范承诺未解决且未调用.then()

Javascript AngularJS Karma测试规范承诺未解决且未调用.then(),javascript,angularjs,asynchronous,karma-runner,angular-promise,Javascript,Angularjs,Asynchronous,Karma Runner,Angular Promise,我在AngularJS Karma单元测试服务时遇到问题 我有一个服务,其服务方法如下: service.getIntersectingElements = function (element, elements) { var deferred = $q.defer(); var tolerance = 20; var intersectingElements = []; $timeout(function () { for (var i = 0;

我在AngularJS Karma单元测试服务时遇到问题

我有一个服务,其服务方法如下:

service.getIntersectingElements = function (element, elements) {
    var deferred = $q.defer();
    var tolerance = 20;
    var intersectingElements = [];
    $timeout(function () {
        for (var i = 0; i < elements.length; i++) {
            if (element.$$hashKey != elements[i].$$hashKey)
                if (service.checkIntersection(element.Location, elements[i].Location, tolerance))
                    intersectingElements.push(elements[i]);
        }
        if (intersectingElements.length > 0)
            deferred.resolve(intersectingElements);
        else
            deferred.reject();
    });

    return deferred.promise;
};
我调用与控制器中完全相同的服务方法。但测试以“完成”结束,这是可以的。但是如果我改变路线

expect(result).toEqual([{Id: 2, Name: 'Fire', Location: {x: 200, y: 200}}]);

测试也完成了,没有失败。但如果是那样的话,我预计考试会失败

我已经尝试注入$rootScope并调用$rootScope。$digest;在服务方法调用之后。这应该解决之前的承诺,但事实上它没有任何效果,如果我放置摘要或不

所以我的问题是,如何测试服务方法返回的承诺,并在karma单元测试中比较已解决并传递给承诺的值

编辑: 我试过$timeout.flush;$rootScope.$digest;在服务方法调用之后

我注入了这样的服务,如果它有帮助的话:

var service;
var $timeout;
var $rootScope;

beforeEach(module('app'));
beforeEach(module('app.services'));

beforeEach(angular.mock.inject(function (intersectService, _$timeout_, _$rootScope_) {
    service = intersectService;
    $timeout = _$timeout_;
    $rootScope = _$rootScope_;
}));

好的,我自己修好了

首先。。。我需要刷新我之前尝试过的超时,并且我需要执行范围应用

it('should get the intersecting elements', function () {
    var element = {Id: 1, Name: 'Water', Location: {x: 200, y: 200}, $$hashKey: "1"};
    var elements = [
        {Id: 1, Name: 'Water', Location: {x: 200, y: 200}, $$hashKey: "1"},
        {Id: 2, Name: 'Fire', Location: {x: 200, y: 200}, $$hashKey: "2"}
    ];

    var promise = service.getIntersectingElements(element, elements);

    var result;
    promise.then(function (res) {
        result = res;
    },
    function (error) {
        result = "error";
    });

    $rootScope.$apply();
    $timeout.flush();

    expect(result).toEqual([{Id: 2, Name: 'Fire', Location: {x: 250, y: 200}, $$hashKey: "2"}]);
});
整个事情现在看起来就像上面那样

但是第二。。。这不是真正的错误。我在上面讨论的服务方法中使用了$$hashKey属性,这显然没有设置,因为我没有在测试数据中设置它。如果变量位于$scope上,则通常存在$$hashKey。所以我不记得设置它


因此,答案是设置$$hashKey,如上面代码所示。

$$hashKey在使用angular.equals时不需要,因为它忽略了$*属性和函数

expectangular.equalsresult,[{Id:2,名称:'Fire',位置:{x:250,y:200}]


我添加这个作为回答,因为我没有足够的代表发表评论。

我可能会遇到类似的问题,但没有使用$timeout,所以我无法刷新它。承诺来自巴贝尔polyfill,承诺从未解决,我不知道如何兑现:
var service;
var $timeout;
var $rootScope;

beforeEach(module('app'));
beforeEach(module('app.services'));

beforeEach(angular.mock.inject(function (intersectService, _$timeout_, _$rootScope_) {
    service = intersectService;
    $timeout = _$timeout_;
    $rootScope = _$rootScope_;
}));
it('should get the intersecting elements', function () {
    var element = {Id: 1, Name: 'Water', Location: {x: 200, y: 200}, $$hashKey: "1"};
    var elements = [
        {Id: 1, Name: 'Water', Location: {x: 200, y: 200}, $$hashKey: "1"},
        {Id: 2, Name: 'Fire', Location: {x: 200, y: 200}, $$hashKey: "2"}
    ];

    var promise = service.getIntersectingElements(element, elements);

    var result;
    promise.then(function (res) {
        result = res;
    },
    function (error) {
        result = "error";
    });

    $rootScope.$apply();
    $timeout.flush();

    expect(result).toEqual([{Id: 2, Name: 'Fire', Location: {x: 250, y: 200}, $$hashKey: "2"}]);
});