12

は、私は、次の(些細な)サービスと同様に、$ rootScopeの値に依存したサービスがあるとします。何で、私はユニットテストにこれをしたい場合は$ rootScopeに価値を置くことによって

angular.module('myServices', []) 
.factory('rootValGetterService', function($rootScope) { 
    return { 
     getVal: function() { 
      return $rootScope.specialValue; 
     } 
    }; 
}); 

それについて最善の方法は? (提供使用することにより

答えて

6

)は、新しい$ rootScopeを注入することができます

describe('in rootValGetter', inject(function ($rootScope) { 
    var scope; 
    var testRootValGetter; 

    beforeEach(function() { 

     scope = $rootScope.$new(); 

     module(function ($provide) { 
      $provide.value('$rootScope', scope); 
     }); 

     inject(function ($injector) { 
      testRootValGetterService = $injector.get('rootValGetterService'); 
     }); 
    }); 

    it('getVal returns the value from $rootScope', function() { 
     var value = 12345; 

     scope.specialValue = value; 

     expect(testRootValGetterService.getVal()).toBe(value); 
    } 
} 
+12

このパターンは私にとっては機能しません。角はこのエラーを投げつけ続けます: "エラー:インジェクタはすでに作成されていますが、モジュールを登録できません!" – Espilon

+0

'$ rootScope'を直接使うのではなく、なぜ' scope = $ rootScope。$ new(); 'を使う必要がありますか? –

+1

私は単体テストを互いに分離して実行したいからです。 –

3

angular-mocks.jsを含め、その後、angular.mock.injectを使用します。

+1

ドキュメントへのリンクが古く、現在のリンクはhttps://docs.angularjs.org/api/ngMock/function/angular.mock.inject –

+0

です。 @ GregoryAvery-Weirありがとうございました。 – L42y

21
... 
var $rootScope; 
beforeEach(inject(function(_$rootScope_) { 
    $rootScope = _$rootScope_; 
})); 
... 
+0

すべてのテストで同じスコープを提供していませんか?新しいサービススコープをどのように新しいサービスに渡しますか? – Tamlyn

+0

こんにちはTamlyn、ルートスコープは新鮮ではありませんか? –

+1

そうでなければ、クロージャの '$ rootScope'と' $ rootScope'引数の間に命名の競合があるので、アンダースコアが必要です。 –

0

単なるテストを含む、より詳細な回答を与えることを試みますケース:

...

var $rootScope; 
beforeEach(inject(function(_$rootScope_) { 
    $rootScope = _$rootScope_; 
})); 

...

it('getVal returns the value from $rootScope', function() { 
     var value = 12345; 
     $rootScope.specialValue = value; 
     expect(testRootValGetterService.getVal()).toBe(value); 
    } 
0

は、ここに私がやったことだ:

it('some kind of wacky test', function($rootScope, Translate){ 
    $rootScope.lang = 'en'; 
    expect(Translate('overview').toBe('Overview'); 
} 
0

が、これはこれは同様の問題を解決したとして、他の人に役立ちます願っています。

var rootValGetterService; 

beforeEach(inject(function($rootScope,$injector) { 
    $rootScope.specialValue = "test"; 
    rootValGetterService= $injector.get('rootValGetterService'); 
})); 

it("Should have a service", function() { 
    expect(rootValGetterService).toBeDefined(); 
}); 
0

代わりの新しいスコープを作成し、あなたが$scopeを注入されたかのように、あなたが$rootScopeに直接必要な特性を模擬することができます。

$rootScopeには、テストしているコードで利用可能なプロパティが挿入されます。

少なくともこれは私が同じ問題を解決した方法です。

あなたの例では、次のコードが有効です。

beforeEach(inject(function($rootScope) { 
    $rootScope.specialValue = 'whatever'; 
})); 
関連する問題