いくつかのチュートリアルと基本的な例を実行しましたが、コントローラーの単体テストを作成するのに苦労しています。コントローラーをインスタンス化し、Angularにオブジェクトを注入させ、コントローラー$rootScope
の新しいscope
オブジェクトを作成するために使用されるコードスニペットを見てきました。しかし、なぜかわかりませんかctrl.$scope
?未定義です:
describe('EmployeeCtrl', function () {
var scope, ctrl, $httpBackend;
beforeEach(inject(function (_$httpBackend_, $rootScope, $controller, $filter) {
$httpBackend = _$httpBackend_;
scope = $rootScope.$new();
ctrl = $controller('EmployeeCtrl', { $scope: scope});
expect(ctrl).not.toBeUndefined();
expect(scope).not.toBeUndefined(); //<-- PASS!
expect(ctrl.$scope).not.toBeUndefined(); //<-- FAIL!
}));
});
scope
代わりに変数を使用することになりましたが、最初のテストでは、コントローラー内の関数変数ctrl.$scope
を単体テストする方法がわかりませんでした。
コントローラ:
function EmployeeCtrl($scope, $http, $filter, Employee) {
var searchMatch = function (haystack, needle) {
return false;
}
}
壊れた単体テスト:
it('should search ', function () {
expect(ctrl.searchMatch('numbers','one')).toBe(false);
});
これは私が得るものです
TypeError:オブジェクト#にはメソッド'searchMatch'がありません
その機能をどのようにテストしますか?回避策として、メソッドを$ scopeに移動してテストできるようにしましscope.searchMatch
たが、これが唯一の方法かどうか疑問に思いました。
最後に、私のテストで$filter
は未定義であるように見えますが、どのように注入しますか?私はこれを試しましたが、機能しませんでした:
ctrl = $controller('EmployeeCtrl', { $scope: scope, $filter: $filter });
ありがとう
更新: $filterを注入する上記の方法は問題なく機能します。