1

考虑下面的两个代码片段,取自angular docs on unit testing

在 Angular 中,控制器与 DOM 操作逻辑严格分开,这使得可测试性故事变得更容易,如本例所示:

function PasswordCtrl($scope) {
  $scope.password = '';
  $scope.grade = function() {
    var size = $scope.password.length;
    if (size > 8) {
      $scope.strength = 'strong';
    } else if (size > 3) {
      $scope.strength = 'medium';
    } else {
      $scope.strength = 'weak';
    }
  };
}

测试很简单

var pc = new PasswordCtrl();
pc.password('abc');
pc.grade();
expect(pc.strength).toEqual('weak');

我想知道第二个代码片段是如何工作的。没有模拟 $scope 传递给它,但显然它有效。方法调用pc.password('abc');andpc.grade()似乎是 and 的别名$scope.password('abc')$scope.grade()但是这些别名来自哪里?这是角度内置的东西吗?相当于ruby的method_missing?如果是这样,它是如何在引擎盖下工作的?

4

1 回答 1

0

不,它不能按原样工作。如果我只是将您在此处的内容粘贴到 2 个文件中并告诉 karma 运行它,我会收到以下错误。正如预期的那样,错误是:

Chrome 26.0 (Mac) ERROR
    Uncaught TypeError: Cannot set property 'password' of undefined
    at /Volumes/.../utest/test/ctrl.js:2 Chrome
26.0 (Mac): Executed 0 of 0 ERROR (0.173 secs / 0 secs)

哪里ctrl.js:2是:

  $scope.password = '';

不幸的是,AngularJS 文档并不清楚。所有测试都必须在describe块内进行,因此文档必须假定读者知道模拟beforeEach块中所需的 $scope。

于 2013-05-11T15:38:24.553 回答