我有以下指令:如何注入模拟依赖性成的角度指令茉莉上噶
function TopLevelMenuDirective ($userDetails, $configuration) {
return {
restrict:'A',
templateUrl: staticFilesUri + 'templates/TopLevelMenu.Template.html',
scope: {
activeTab: '='
},
link: function (scope, element, attributes) {
var userDetails = $userDetails;
if ($userDetails) {
scope.user = {
name: userDetails.name ? userDetails.name : 'KoBoForm User',
avatar: userDetails.gravatar ? userDetails.gravatar: (staticFilesUri + '/img/avatars/example-photo.jpg')
};
} else {
scope.user = {
name: 'KoBoForm User',
avatar: staticFilesUri + '/img/avatars/example-photo.jpg'
}
}
scope.sections = $configuration.sections();
scope.isActive = function (name) {
return name === scope.activeTab ? 'is-active' : '';
}
}
}
}
欲嘲笑依赖于单元测试的不同的代码路径与由单元已知值试验。我有以下样本单元测试:
it('should set $scope.user to values passed by $userDetails',
inject(function($compile) {
var element = '<div top-level-menu></div>';
element = $compile(element)($scope);
$scope.$apply();
expect(element.isolateScope().user.name).toBe('test name');
expect(element.isolateScope().user.avatar).toBe('test avatar');
}
));
这给了我两个问题。
首先,由于模板位于外部文件中,因此当它加载时,它会尝试获取它并导致错误,因为无法找到该文件,这是合乎逻辑的,因为它位于测试环境中,而不是实际的服务器。其次,没有明显的方法来模拟通过构造函数注入到指令中的依赖关系。在测试控制器时,您可以使用$controller
服务,但由于指令通过编译带有传递作用域的html标记而间接实例化,因此无法直接实例化它(例如,没有类似的$directive
)。这妨碍我分别将$userDetails.name
和$userDetails.gravatar
设置为'test name'
和'test avatar'
。
如何获得正确编译的指令并使用自定义的$ userDetails依赖运行?