如何模拟或存根在加载时执行的AJAX调用?

时间:2016-10-03 20:23:43

标签: angularjs jasmine karma-jasmine

我有一个角度应用程序,在引导之前调用2个服务,我想模拟或存根这些调用。否则,karma会尝试执行这些调用,并在控制台中继续显示错误。

我该怎么做?

请参阅下面的getConfig()getUser()函数:

JavaScript的:

import appConstant from './app-gouvernementales.constant.js';
import appConfig from './app-gouvernementales.config.js';
import appRun from './app-gouvernementales.run.js';
import AppComponent from './app-gouvernementales.component.js';

const requires = [
  'ngMessages',
  'ngRoute',
  'ngSanitize',
  'permission',
  'permission.ng',
  'ngMockE2E',
];

const app = angular
  .module('app-gouvernementales', requires)
  .config(appConfig)
  .run(appRun)
  .component('appGouvernementales', AppComponent)
  .name;

// create and bootstrap application
getConfig()
  .then((config) => {
    angular.module('app-gouvernementales')
      .constant('APP_SETTINGS', appConstant(config));

    return { url: `${config.protocol}://${config.host}`, uid: config.shibbolethUid };
  })
  .then(data => getUser(data.url, data.uid))
  .catch((err) => {
    console.log(err);
    document.location.href = '/erreur/role';
  })
  .then((_user_) => {
    const user = _user_.data;

    angular.module('app-gouvernementales')
      .constant('USER', user);
  })
  .then(() => {
    angular.bootstrap(document, ['app-gouvernementales']);
  });

function getConfig() {
  const initInjector = angular.injector(['ng']);
  const $http = initInjector.get('$http');

  return $http.get('/gouvernementales/app-gouvernementales.config.json')
    .then(response => response.data);
}

function getUser(url, uid) {
  const initInjector = angular.injector(['ng']);
  const $http = initInjector.get('$http');

  return $http.get(`${url}/roles`, { withCredentials: true, headers: { 'X-uid': uid } });
}

export default app;

1 个答案:

答案 0 :(得分:0)

您可以使用settings

$httpBackend

但理想情况下,您不希望在单元测试时引导整个应用程序,而只是想要测试的特定模块。在这种情况下,您可以模拟传递给该模块的数据。