Глобально макет объекта в angularjs для тестирования жасмина/кармы

У меня есть объект, который я высмеиваю для модульного тестирования. По существу в моем тестовом файле я делаю это следующим образом:

var mockObject = {
    mockMethod1 : function() {return true},
    mockMethod2 : function() {return true}
};


beforeEach(module('myModule') , function ($provide) {
    $provide.value('realObject',mockObject);
});

Я понимаю, что, поскольку я тестирую функциональность в своем модуле и т.д.... где-нибудь, ссылающееся на "realObject", будет использовать мой "mockObject"

Моя проблема в том, что я сделал несколько js файлов для тестирования, и я не хочу определять свой "mockObject" в каждом из них... и я не хочу поддерживать его в других местах, кроме меня.

Есть ли способ переместить мой "mockObjact" в отдельный файл, который будет включен в файл karma.conf.js, который сделает "mockObject" доступным для инъекций в любой из моих тестовых файлов..... Im размышляет строки того, как вы вводите $rootScope

Ответ 1

Вы можете создать глобальную функцию beforeEach, если она написана вне контекста определенного набора, но все еще выполняется Jasmine, например. создайте пользовательский файл для загрузки с помощью Karma и напишите свою функцию beforeEach, не прилагая его к описательной функции.

Пример:

var myGlobal;

beforeEach(function() {
    // This will run before any it function.
    // Resetting a global state so the change in this function is testable
   myGlobal = 10
});

describe('first suite', function(){
  it('is a test', function(){
      expect(myGlobal).toBe(10);
      // Set the value to show that beforeEach is executed for each it function
      myGlobal = 20;
      expect(myGlobal).toBe(20);
  });

  it('is another test', function(){
      expect(myGlobal).toBe(10);
      myGlobal = 30;
      expect(myGlobal).toBe(30);
  });
});

describe('second suite', function(){
  it('is a test', function(){
      expect(myGlobal).toBe(10);
  });
});

Смотрите скрипку здесь

Ответ 2

Вы можете создать службу, в которой размещается ваш макет, и ввести эту службу в каждый тестовый файл.

beforeEach(inject(function($rootScope, $controller, yourMockSvc) {
    appScope = $rootScope.$new();
    appCtrl = $controller('AppController', {
        $scope: appScope,
        yourSvc: yourMockSvc
    });
}));

Ответ 3

Просто определите свой макет объекта внутри другого файла и экспортируйте его. Вы должны иметь возможность использовать его в любом файле.