1

Jasmine でいくつかの Angular.js コードをテストしています。これを行うには、Angular インジェクターが必要です。

var injector = angular.injector(['ng', 'ngRoute', 'mainModule']);

これは問題なく動作しますが、$location を使用するコントローラーをテストするときは、それをインジェクターに追加する必要があります。

var injector = angular.injector(['ng', 'ngRoute', 'location', 'mainModule']);

これでエラーがスローされます:

Error: Error: [$injector:modulerr] Failed to instantiate module location due to:
Error: [$injector:nomod] Module 'location' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.

そこに $location サービスを含めるにはどうすればよいですか? ありがとう。

- - - - - - - 編集 - - - - - - - - -

多くの回答がなかったので、詳細を追加すると思いました。

これが私がテストしようとしているコントローラーです(またはその定義、すべてのコードを貼り付けるわけではありません):

var app = angular.module('mainModule');

app.controller('appController', ['$window', '$scope', '$location', '$wsService', '$userService', '$labelService', function ($window, $scope, $location, $wsService, $userService, $labelService) {
    //body of the controller
}]);

元の投稿の単体テストでインジェクターを作成する方法を既に見ましたが、インジェクターを使用してコントローラーを作成する方法は次のとおりです。

var scope;
var controller;
var getController = function() {
    injector.invoke( ['$rootScope', '$controller', function ($rootScope, $controller) {
        scope      = $rootScope.$new();
        controller = $controller('appController', {$scope: scope});
    }]);
};

これがいくつかの潜在的な答えを生み出すのに役立つことを願っています. ありがとう

4

1 に答える 1

2

私自身の質問に答えるために。次のコントローラーをテストする方法は次のとおりです。

var app = angular.module('mainModule');

app.controller('appController', ['$window', '$scope', '$location', '$userService', function ($window, $scope, $location, $userService) {
    //body of the controller
}]);

1単体テストでインジェクターを作成します。

var injector = angular.injector(['ng', 'ngRoute', 'mainModule']);

2必要なサービスを呼び出します。

injector.invoke( ['$userService',  function ($userService) {
    service     = $userService;
}]);

3模擬位置情報サービス:

var mockLocation = {
    path : ""
};

テストしているコントローラーに必要pathだったので、他に何もモックしませんでしたが、必要なものは何でもモックしました。

4コントローラを呼び出します。

var scope;
var controller;
var getController = function() {
    injector.invoke( ['$rootScope', '$controller', function ($rootScope, $controller) {
        scope      = $rootScope.$new();
        controller = $controller('appController', {$scope: scope, $location: mockLocation});
    }]);
};

これで、コントローラーを単体テストで使用できるようになりました。
これにより、「不明なプロバイダー」や位置情報サービスに関連するその他のエラーが解消されました。
このブログ投稿は、著者のおかげで答えを得るのに役立ちました。

于 2014-04-30T10:37:41.197 に答える