角度控制器:这些神奇的方法如何在这个单元测试中工作?

时间:2013-05-11 09:30:16

标签: javascript angularjs

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

  

在角度控制器中,控制器与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');pc.grade()似乎是$scope.password('abc')$scope.grade()的别名,但这些别名来自何处?这个东西是有角度的吗?一种等同于ruby的method_missing?如果是这样,它是如何在引擎盖下工作的?

1 个答案:

答案 0 :(得分:0)

不,它不能正常工作。如果我只是将你在这里的内容粘贴到2个文件中并告诉业力来运行它,我会收到以下错误。正如所料,错误是:

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。