【问题标题】:mocking and testing directive with isolate scope containing ng-model具有包含 ng-model 的隔离范围的模拟和测试指令
【发布时间】:2016-03-25 19:39:01
【问题描述】:

我有一个要模拟和测试的指令。该指令将 ngModel 设置为双重绑定和 transclude true

scope: {'ngModel': '=' } 

transclude: true

我要测试的规范非常简单。

$el.find('input').prop('checked', $scope.ngModel);

在我的单元测试中,我创建了一个 beforeEach 并创建了用于测试 ngModel=checked

的指令
   element = angular.element("<div *directiveName* ><div><input type=\"checkbox\" ngModel=checked /> </div></div>");

        $rootScope = $rootScope.$new();
        $compile(element)($rootScope);
        $rootScope.$digest(element);

        scope = element.isolateScope();

通常我会将范围设置为等于 element.scope()。我会在这个权利上调用 isolateScope() 方法吗?

我相信,由于我将范围设置为等于元素 isolateScope(),因此规范应该像

一样简单
        expect(scope.ngModel).to.equal('checked');

但是,scope.ngModel 是未定义的。我不确定创建指令或调用测试时缺少什么。任何方向将不胜感激。

【问题讨论】:

  • 你的指令是否有一个独立的范围?尝试范围 = element.isolateScope() ||元素.范围;涵盖这两种情况。

标签: javascript angularjs unit-testing


【解决方案1】:

您没有正确地将值传递给元素。应该是:

element = angular.element("<div *directiveName* ><div><input type=\"checkbox\" ng-model=checked /> </div></div>");

变化是 ng-model 而不是 ngModel。

我还建议在指令中为您的自定义属性使用不同的名称,因为与内置的 angular 指令混淆。

【讨论】:

  • 如果这是我写的指令,我会的。我只是在测试它。 ngModel 正是他们的做法
  • 所以你不能重命名属性,但你仍然需要在测试html中让它是ng-model而不是ngModel
  • 我明白你在说什么。我发现了骆驼套管错误。但是,在我的测试中,ngModel 仍然是未定义的。不知道额外的步骤是什么。
  • 您还将 ng-model 添加到指令元素内部的元素中,而不是直接在其上。这可能是为什么它没有捡起它
猜你喜欢
  • 2013-09-04
  • 2016-05-03
  • 2015-03-17
  • 2014-08-07
  • 2015-02-26
  • 2013-03-15
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多