Глобально макет объекта в 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
Просто определите свой макет объекта внутри другого файла и экспортируйте его. Вы должны иметь возможность использовать его в любом файле.