依存関係として $interval を持ち、それを利用して動作するように見えるサービスを作成しました。残念ながら、アプリの単体テストをしようとすると、角度によって $interval サービスが見つかりません:
Unknown provider: $$qProvider <- $$q <- $interval
いつものようにコントローラー内でサービスを呼び出すのではなく、アプリの run() メソッドで呼び出します。
app.service('myService', ['$rootScope', '$window', '$interval', myService]);
app.run(function (myService) {
...
});
動作しますが、アプリをテストしようとするとクラッシュします。残りの角度サービスにはこの問題 ($window、$location、$rootScope など) はないようです。この同じサービスでさえ、app.run() で呼び出すのではなく、コントローラーにサービスをアタッチすると機能します。 :
app.controller('myController', ['myService', function(myService){ ... }]);
Karma+Mocha+Sinon+Chai を使用してテストします。
更新 app.run() で $interval を使用しようとするミニアプリの例:
var anApp = angular.module('myTestApp', ['ngRoute']);
anApp.run(function($rootScope, $timeout, $window, $location, $interval) {
// blah
});
テスト:
describe("Lalarala", function() {
var scope = null;
beforeEach(function() {
module("myTestApp");
inject(function ($rootScope) {
scope = $rootScope.$new();
});
});
it("doesnt crash", function () {
//blah
});
});
注: app.run() から $interval を削除すると機能します。代わりに、$timeout、$window、または $location などの他のAngular サービスは問題にならないようです。
また、$resource などの他のサービスにもこの問題があることに気付きました。
これらのサービスのいくつかは、準備が整う前に何か他のものが必要になると思います。そのため、app.run() で呼び出すことができません。
助けてくれてありがとう。