Angularjs 如何测试'&;属性';从使用karma的隔离范围的指令?
我正在测试一个指令的回调函数 简而言之(角度1.x,业力和角度模拟): 指令指出:Angularjs 如何测试'&;属性';从使用karma的隔离范围的指令?,angularjs,karma-jasmine,Angularjs,Karma Jasmine,我正在测试一个指令的回调函数 简而言之(角度1.x,业力和角度模拟): 指令指出: $scope.show是一个函数 $scope.show预期的“消息”参数 指令代码: angular.module('test', []) .controller('alertCtrl', function($scope) { $scope.show({ message: 'Hello' }) }) .directive('alert', function() { r
- $scope.show是一个函数
- $scope.show预期的“消息”参数
angular.module('test', [])
.controller('alertCtrl', function($scope) {
$scope.show({
message: 'Hello'
})
})
.directive('alert', function() {
return {
controller: 'alertCtrl',
scope: {
show: '&'
}
}
})
规范:
beforeEach(function () {
$scope.show = function (message) {
alert(message)
}
})
it('must execute an expression', function(){
element = $compile(`
<alert show="show(message)"></alert>`)($scope);
$scope.$digest() // It makes no difference
scope = element.isolateScope()
scope.$digest() // It makes no difference
console.log(angular.mock.dump(scope)) // scope.show == undefined
})
在每个(函数()之前{
$scope.show=函数(消息){
警报(信息)
}
})
它('必须执行表达式',函数(){
元素=$compile(`
`)($范围);
$scope.$digest()//这没什么区别
scope=element.isolateScope()
scope.$digest()//这没有区别
console.log(angular.mock.dump(scope))//scope.show==未定义
})
编译完成后,指令属性“show”未定义。我错过了什么
编辑:
完整的代码
angular.module('test', [])
.controller('alertCtrl', function($scope) {
$scope.show({
message: 'Hello'
})
})
.directive('alert', function() {
return {
controller: 'alertCtrl',
scope: {
show: '&',
bind: '=',
string: '@'
}
}
})
describe('test', function(){
beforeEach(angular.mock.module('test'));
beforeEach(angular.mock.inject(function (_$compile_, _$rootScope_) {
$compile = _$compile_;
$scope = _$rootScope_.$new();
}))
beforeEach(function () {
$scope.show = function (message) {
alert(message)
}
$scope.bind = {data: 123}
})
it('must execute an expression', function(){
element = $compile(`
<alert show="show(message)"
bind="bind"
string="'World'"
></alert>`)($scope);
$scope.$digest() // It makes no difference
scope = element.isolateScope()
scope.$digest() // It makes no difference
console.log(angular.mock.dump(scope)) // scope.show == undefined
})
})
角度模块('test',[])
.controller('alertCtrl',函数($scope){
$scope.show({
留言:“你好”
})
})
.directive('alert',function(){
返回{
控制器:“alertCtrl”,
范围:{
显示:“&”,
绑定:'=',
字符串:'@'
}
}
})
描述('test',function()){
之前(角度模拟模块(“测试”);
beforeach(angular.mock.inject(函数($compile,$rootScope){
$compile=\$compile;
$scope=\$rootScope\$new();
}))
beforeach(函数(){
$scope.show=函数(消息){
警报(信息)
}
$scope.bind={data:123}
})
它('必须执行表达式',函数(){
元素=$compile(`
`)($范围);
$scope.$digest()//这没什么区别
scope=element.isolateScope()
scope.$digest()//这没有区别
console.log(angular.mock.dump(scope))//scope.show==未定义
})
})
业力的输出。。。
警报:“你好”
日志:'范围(3):{
显示:未定义
绑定:{“数据”:123}
字符串:“‘世界’”
}'
Chrome 59.0.3071(Linux 0.0.0):执行1/1成功(0.01秒/0.036秒)看起来您在错误的共享作用域变量中声明了show函数。您是否在declare语句下声明了作用域变量,并在BEFOREACH中使用$rootScope初始化它。$new()然后将函数添加到其中,然后将其传递到指令实例?我相信您所做的是正确的,只有测试部分看起来是错误的。尝试替换
$scope.$digest()//它没有区别scope=element.isolateScope()scope.$digest()//它没有区别console.log(angular.mock.dump(scope))//scope.show==未定义的$scope.$digest();expect(element.isolateScope().show).toBeDefined()代码>我建议您使用间谍
来测试函数绑定。Jasmine的spyOn函数工作得很好!谢谢@JulonLou!