33

私は Angular を初めて使用し、Stack Overflow で同様に関連するすべての質問を確認しましたが、どれも役に立ちませんでした。すべてが正しくセットアップされていると思いますが、単体テストにサービスを挿入しようとすると、「不明なプロバイダー」エラーが引き続き発生します。以下にコードを配置しました - 誰かが明らかなエラーを見つけられることを願っています!

次のように、モジュールを別の.jsファイルに定義します。

angular.module('dashboard.services', []);
angular.module('dashboard.controllers', []);

ここで、EventingService というサービスを定義します (簡潔にするためにロジックを削除しています)。

angular.module('dashboard.services').factory('EventingService', [function () {
    //Service logic here
}]);

EventingService を使用するコントローラーを次に示します (これは実行時にすべて正常に動作します)。

angular.module('dashboard.controllers')
    .controller('Browse', ['$scope', 'EventingService', function ($scope, eventing) {
        //Controller logic here
}]);

これが私の単体テストです - 単体テストを実行するとエラーを引き起こす EventingService を挿入しようとする行です:

describe('Browse Controller Tests.', function () {
    beforeEach(function () {
        module('dashboard.services');
        module('dashboard.controllers');
    });

    var controller, scope, eventingService;

    beforeEach(inject(function ($controller, $rootScope, EventingService) {
        scope = $rootScope.$new();
        eventingService = EventingService

        controller = $controller('Browse', {
            $scope: scope,
            eventing: eventingService
        });
    }));


    it('Expect True to be True', function () {
        expect(true).toBe(true);
    });
});

テストを実行すると、次のエラーが発生します。

エラー: 不明なプロバイダー: EventingServiceProvider <- EventingService

jasmine の specrunner.html ファイルに必要なソース ファイルがすべて含まれていることを確認しました (これは Asp.Net MVC プロジェクトです)。

<!-- Include source files here... -->
@Scripts.Render("~/bundles/jquery")
<script type="text/javascript" src="@Url.Content("~/Scripts/angular.js")"></script>  
<script type="text/javascript" src="@Url.Content("~/Scripts/angular-mocks.js")"></script>                 

<script type="text/javascript" src="@Url.Content("~/App/scripts/app.js")"></script>                       <!-- Angular modules defined in here -->
<script type="text/javascript" src="@Url.Content("~/App/scripts/services/eventing.js")"></script>         <!-- My Eventing service defined here -->


<script type="text/javascript" src="@Url.Content("~/App/scripts/controllers/browse.js")"></script>        <!-- My Browse controller defined here -->

<!-- Include spec files here... -->
<script type="text/javascript" src="@Url.Content("~/App/tests/browse.js")"></script>                      <!-- The actual unit test here -->

Angular が EventingService について不平を言ってこのエラーをスローしている理由を理解できません。私のコントローラーは実行時に正常に動作します-テストしようとするとエラーが発生するので、モック/インジェクションで何かを台無しにしたかどうかに興味があります。

テストに関する Angular のヘルプはくだらないので、現時点では困惑しています。誰かが提供できるヘルプや提案は非常に高く評価されます。ありがとう。

4

4 に答える 4

8

コントローラー (モジュールの下で定義dashboard.controllers) が別のモジュール ( dashboard.services) に含まれるいくつかのサービスに依存している場合は、モジュール シグネチャで依存モジュールを参照する必要があります。

angular.module('dashboard.services', []);
angular.module('dashboard.controllers', ['dashboard.services']);
于 2013-04-04T12:08:58.550 に答える
2

この質問はかなり古いものですが、次のような問題を解決するのにかなりの時間を費やしました。

Error: Unknown provider: SomeServiceProvider <- SomeService

したがって、この問題の別の考えられる原因をここに残します。うまくいけば、それは誰かに役立つでしょう。

私の場合、プロジェクトにまったく同じ名前の 2 つのモジュールがありましたが、異なる依存関係が作成されました。つまり、次の 2 つの異なる .js ファイルが作成されました。

angular.module('moduleName', [dependencies]))

角度のドキュメントから:

1 つの引数を渡すと既存の angular.Module が取得されますが、複数の引数を渡すと新しい angular.Module が作成されます。

結論: テストで注入されたのは、間違った依存関係を持つモジュールであることが判明しました。誤って作成されていたモジュールから 2 番目の引数を削除すると、問題が解決しました。

于 2015-10-27T22:09:13.003 に答える
0

次のように、他の集約モジュールに依存する追加のモジュールを定義しようとしましたか?

angular.module( 'dashboard', [ 'dashboard.services', 'dashboard.controllers' ] )

したがって、 beforeEach で、次のように両方のサブモジュールが定義されている 1 つのモジュールを指定できます。

describe('Browse Controller Tests.', function () {
    beforeEach(function () {
        module('dashboard');
    });

    var controller, scope, eventingService;

    beforeEach(inject(function ($controller, $rootScope, EventingService) {
        scope = $rootScope.$new();
        eventingService = EventingService

        controller = $controller('Browse', {
            $scope: scope,
            eventing: eventingService
        });
    }));


    it('Expect True to be True', function () {
        expect(true).toBe(true);
    });
});
于 2013-07-08T22:41:42.333 に答える