Неперехваченная ошибка типа: не удается прочитать свойство ‘service.method’ неопределенного типа

#angularjs #karma-jasmine

#angularjs #karma-jasmine

Вопрос:

 describe('Controller:insightSettingsController', function() {
'use strict';
var insightSettingsCtrl;
var settingsService;
var UtilsService;
var scope;
var updateMethodDeferred;
var httpBackend;
var deferred;
var q;
var spy;
beforeEach(module('ui.router',proname.components.insightSettings.module.name));

beforeEach(function() {
var mockUtilsService = {};
module(function(_$provide_) {
  _$provide_.value('UtilsService', mockUtilsService);
});

inject(function($q) {
  deferred = $q.defer();
  mockUtilsService.getConfigurations = function() {};
  spyOn(mockUtilsService, 'getConfigurations')
      .and.returnValue(deferred.promise);
});

});
beforeEach(inject(function(
  _$controller_, _$httpBackend_, _$rootScope_, _settingsService_,
  _UtilsService_, _$q_) {
  scope = _$rootScope_.$new();
  spy = jasmine.createSpy();
  settingsService = _settingsService_;
  UtilsService = _UtilsService_;
  httpBackend = _$httpBackend_;
  insightSettingsCtrl = function() {
  return _$controller_(
      dbmcm.components.settings.insightSettingsController,
      {$scope: scope, UtilsService: UtilsService});
};

}));

describe(
'Check Existing Function , parameters, Initialization of function',
function() {
it('should call UtilsService.getConfigurations() once',
  function() {
    insightSettingsCtrl();
    deferred.resolve();
    scope.$digest();
    expect(UtilsService.getConfigurations).toHaveBeenCalled();
  });
});

});
  

Привет, я пишу тестовые примеры angular для своего отдельного модуля.К сожалению, мой модуль выше разбивает мои тестовые примеры, получая ошибку debug.js:44 Ошибка неперехваченного типа: не удается прочитать свойство ‘get Configuration’ неопределенного типа. Я запускаю функцию getConfigurations во время инициализации контроллера, пожалуйста, посмотрите ниже

  constructor: function(UtilsService) {
 UtilsService.getConfigurations().then(function(response) {
   this.utilsConfig_ = response;
 }.bind(this));
}
  

Я думаю, что шпион Jasmine проверяет только, была ли вызвана функция, без запуска фактической реализации. Вот почему getConfigurations().затем выдает ошибку.
для этого я применил .и.callThrough() в своих тестовых примерах

 it('should call UtilsService.getConfigurations() once',
  function() {
   spyOn(UtilsService, 'getConfigurations').and.callThrough();
    insightSettingsCtrl();
    deferred.resolve();
    scope.$digest();
    expect(UtilsService.getConfigurations).toHaveBeenCalled();
  });
});
  

После этого я получаю ошибку debug.js: 44 Неперехваченная ошибка: getConfigurations уже был отслежен

Пожалуйста, поправьте меня, где я делаю неправильно. Заранее спасибо

Комментарии:

1. Можете ли вы сказать нам, что такое debug.js строка 44?

Ответ №1:

Либо вы издеваетесь над ним, либо вводите его, если это возможно.

Вы делаете оба для UtilsService .

Я предполагаю, что вы вводите UtilsService .

Итак, удалите следующий код :

 module(function(_$provide_) {
  _$provide_.value('UtilsService', mockUtilsService);
});

inject(function($q) {
  deferred = $q.defer();
  mockUtilsService.getConfigurations = function() {};
  spyOn(mockUtilsService, 'getConfigurations')
      .and.returnValue(deferred.promise);
})
  

Комментарии:

1. Привет, спасибо за ваш ответ. UtilsService является общим сервисом для всех модулей, поэтому для этого я внедряю module (function( $provide ) { $provide .value(‘UtilsService’, mockUtilsService); });