我目前正在为更新页面上元信息的服务编写一些测试。
mod.service('MetaSrv', ['$rootScope', '$rootElement', function ($rootScope, $rootElement){
return {
updateMetaTitle: function(contents) {
$rootScope.metaTitle = contents;
},
updateMetaElement: function(type, contents) {
var metaEl = angular.element($rootElement.find('meta[name="'+ type +'"]')[0]);
metaEl.attr('content', contents);
}
};
}]);
我想测试这些函数中的每一个作为起点。测试如下所示:
describe('sets', function() {
it('meta title element using $rootscope', function() {
MetaSrv.updateMetaTitle('Some Title');
expect(scope.metaTitle).toBe('Some Title');
});
it('meta description element using $rootElement', function() {
MetaSrv.updateMetaElement('description', 'Some Description');
var el = angular.element(rootElement.find('meta[name="description"]')[0]);
expect(el.attr('content')).toBe('Some Description');
});
});
我需要能够在第一次测试中使用$rootScope
,然后需要访问$rootElement
进行第二次测试。描述块如下:
var MetaSrv, scope, rootElement, element;
beforeEach(function() {
module('mod');
inject(function (_MetaSrv_, $rootScope, $rootElement) {
MetaSrv = _MetaSrv_;
scope = $rootScope.$new();
rootElement = $rootElement;
});
});
目前第一个测试工作正常。使用$rootElement
的第二个测试无法正常工作,它无法在$rootElement
上找到元标记。我不确定如何模拟$rootElement
依赖性以测试元信息更改。
这是更新的描述:
var MetaSrv, scope, rootElement, element;
element = '<div><title ng-bind-template="{{ metaTitle }}">Initial Title</title>';
element += '<meta name="description" content="Initial Description" /></div>';
beforeEach(function() {
module('mod');
module(function($provide) {
$provide.value('$rootElement', angular.element(element));
});
inject(function (_MetaSrv_, $rootScope, $rootElement) {
MetaSrv = _MetaSrv_;
scope = $rootScope;
rootElement = $rootElement;
});
});
创建了一个包含所需 html 的元素,并使用提供程序将新元素用作$rootElement
。测试现在使用这个新$rootElement
,它允许元服务更新和检查测试所需的值。
所有测试现在都按预期运行。