Karma Jasmine тестирует $resource, вызываемый из контроллера

Мне не удается заставить все работать с Karma, чтобы протестировать некоторые вызовы API.

Вот тестовый файл:

describe('Requests controller test', function() {
  beforeEach(module('balrogApp.requests'));

  var ctrl, scope;
  var requestData = [
    {id: 1, project: {id: 1, title: 'Project 1'}, description: 'Some description'},
    {id: 2, project: {id: 2, title: 'Project 2'}, description: 'Another description'}
  ];

  beforeEach(inject(function($rootScope, $controller, _$httpBackend_) {
    $httpBackend = _$httpBackend_;

    $httpBackend.expectGET('/users').respond(requestData);
    $httpBackend.expectGET('/requests').respond(requestData);
    $httpBackend.expectGET('/projects').respond(requestData);
    $httpBackend.expectGET('/requestcomments').respond(requestData);
    $httpBackend.expectGET('/costestimations').respond(requestData);
    $httpBackend.expectGET('/regions').respond(requestData);

    scope = $rootScope.$new();
    ctrl = $controller('requestsController', {$scope: scope});
  }));

  afterEach(function() {
    scope.$destroy();
  });

  it('should fill properties from result from xhr requests', function() {
    var unresolvedResponse = [];

    expect(ctrl.usersList).toEqual(unresolvedResponse);
    expect(ctrl.requestsList).toEqual(unresolvedResponse);
    expect(ctrl.projectsList).toEqual(unresolvedResponse);
    expect(ctrl.requestsCommentsList).toEqual(unresolvedResponse);
    expect(ctrl.costEstimationsList).toEqual(unresolvedResponse);
    expect(ctrl.regionsList).toEqual(unresolvedResponse);

    $httpBackend.flush();

    expect(ctrl.usersList).toEqual(requestData);
    expect(ctrl.requestsList).toEqual(requestData);
    expect(ctrl.projectsList).toEqual(requestData);
    expect(ctrl.requestsCommentsList).toEqual(requestData);
    expect(ctrl.costEstimationsList).toEqual(requestData);
    expect(ctrl.regionsList).toEqual(requestData);
  });
});

Я также пытался использовать toBeUndefined() вместо toEqual(unresolvedResponse), но это ничего не изменило.

Вот файл, в котором определены $resource:

angular.module('balrogApp.services', ['balrogApp.config', 'ngResource'])
  .factory('Requests', ['$resource', 'balrogConfig', function($resource, balrogConfig) {
    return $resource(balrogConfig.backend + '/requests/:id', {id: '@id'});
  }])
  .factory('Projects', ['$resource', 'balrogConfig', function($resource, balrogConfig) {
    return $resource(balrogConfig.backend + '/projects/:id', {id: '@id'}, {'update': { method:'PUT' }});
  }])
  /*  Other factories are there */
  .factory('CostEstimations', ['$resource', 'balrogConfig', function($resource, balrogConfig) {
    return $resource(balrogConfig.backend + '/costestimations/:id', {id: '@id'});
  }]);

И, наконец, часть файла контроллера, которую я тестирую:

angular.module('balrogApp.requests', [
  /* Dependancies */
])
  .controller('requestsController', function(Requests, Users, Projects, RequestsComments, CostEstimations,
                                             Regions, growl, $route, $rootScope, $scope, $location) {
    /* ... */

    this.usersList = Users.query();
    this.requestsList = Requests.query();
    this.projectsList = Projects.query();
    this.requestsCommentsList = RequestsComments.query();
    this.costEstimationsList = CostEstimations.query();
    this.regionsList = Regions.query();
  });

Пока я получаю эту ошибку:

Expected [ $promise: Promise({ $$state: Object({ status: 0 }) }), $resolved: false ] to equal [ ].

Я попытался установить unresolvedResponse в это значение (с правильным синтаксисом и без него), но это ничего не исправило.


person Ellone    schedule 01.12.2015    source источник
comment
Ваши переменные области видимости (например, userList) не являются пустыми массивами при инициализации, а представляют собой неразрешенные промисы перед вызовом $httpBackend.flush(). Я думаю, вы можете использовать службу $q для имитации невыполненного обещания.   -  person FlorianTopf    schedule 01.12.2015
comment
Ну, лучшее, что я нашел, было $q.defer().promise, но это не похоже на неразрешенный ответ.   -  person Ellone    schedule 01.12.2015
comment
попробуйте только $q.defer()   -  person FlorianTopf    schedule 01.12.2015
comment
Да, я тоже это сделал, но нет, это не возвращает неразрешенное обещание afaik   -  person Ellone    schedule 01.12.2015
comment
=› Users.query().$promise, это вернет только промис. => $q.defer() должен возвращать массив с $promise и $resolved, как это сделал бы query(). О чем говорит ожидание, если сравнить его с $q.defer()?   -  person FlorianTopf    schedule 01.12.2015
comment
НЕ совсем так, как ожидалось : Expected [ $promise: Promise({ $$state: Object({ status: 0 }) }), $resolved: false ] to equal Deferred({ promise: Promise({ $$state: Object({ status: 0 }) }), res olve: Function, reject: Function, notify: Function }).   -  person Ellone    schedule 01.12.2015


Ответы (1)


Я попробовал это сам, и то, как вы можете это сделать, меняет ваши ожидания от

expect(ctrl.usersList).toEqual(unresolvedResponse);

to
expect(ctrl.usersList.$resolved).toBeFalsy();

это подтвердит, что запрос отправлен, обещание создано, но ответа сервера еще нет.

Я надеюсь, что это поможет вам.

person Anke Wenz    schedule 03.12.2015
comment
Спасибо, похоже, это можно сделать, но я уже пробовал expect(ctrl.usersList.$resolved).toEqual(false);, и это не сработало, так что это немного сбивает с толку. - person Ellone; 03.12.2015