1

以下のコードの 2 つのスニペットを検討してください。

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');

2 番目のコード スニペットがどのように機能しているか知りたいです。モック $scope は渡されませんが、明らかに動作します。また、メソッド呼び出しpc.password('abc');およびはおよびのエイリアスpc.grade()のようですが、これらのエイリアスはどこから来たのですか? これはAngularに組み込まれているものですか?ruby の method_missing に相当するもの?もしそうなら、それはフードの下でどのように機能しますか?$scope.password('abc')$scope.grade()

4

1 に答える 1

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ブロック内で行う必要があるため、ドキュメントでは、読者がブロックで必要な $scope をモックすることを知っていると想定している必要がありbeforeEachます。

于 2013-05-11T15:38:24.553 に答える