Я пытаюсь протестировать службу angular, которая делает некоторые манипуляции с DOM через службу $document
с жасмином.
Скажем, он просто добавляет некоторую директиву в элемент <body>
.
Такая услуга может выглядеть как
(function(module) {
module.service('myService', [
'$document',
function($document) {
this.doTheJob = function() {
$document.find('body').append('<my-directive></my directive>');
};
}
]);
})(angular.module('my-app'));
И я хочу протестировать его так:
describe('Sample test' function() {
var myService;
var mockDoc;
beforeEach(function() {
module('my-app');
// Initialize mock somehow. Below won't work indeed, it just shows the intent
mockDoc = angular.element('<html><head></head><body></body></html>');
module(function($provide) {
$provide.value('$document', mockDoc);
});
});
beforeEach(inject(function(_myService_) {
myService = _myService_;
}));
it('should append my-directive to body element', function() {
myService.doTheJob();
// Check mock body to contain target directive
expect(mockDoc.find('body').html()).toContain('<my-directive></my-directive>');
});
});
Итак, вопрос в том, что было бы лучшим способом создания такого макета?
Тестирование с помощью реального document
даст нам много проблем при очистке после каждого теста и не будет выглядеть как способ.
Я также попытался создать новый экземпляр реального документа перед каждым тестом, но в итоге возникли разные сбои.
Создание объекта, как показано ниже, и проверка переменной whatever
, но выглядит очень уродливо
var whatever = [];
var fakeDoc = {
find: function(tag) {
if (tag == 'body') {
return function() {
var self = this;
this.append = function(content) {
whatever.add(content);
return self;
};
};
}
}
}
Я чувствую, что мне не хватает чего-то важного здесь и делаю что-то очень неправильное.
Любая помощь очень ценится.