Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何测试'&;属性';从使用karma的隔离范围的指令?_Angularjs_Karma Jasmine - Fatal编程技术网

Angularjs 如何测试'&;属性';从使用karma的隔离范围的指令?

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

我正在测试一个指令的回调函数

简而言之(角度1.x,业力和角度模拟):

指令指出:

  • $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!