web-dev-qa-db-ja.com

$ rootScopeをAngularJSユニットテストに挿入するにはどうすればよいですか?

次の(簡単な)サービスのように、$ rootScopeの値に依存するサービスがあるとします。

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

$ rootScopeに値を入れてこれを単体テストしたい場合、それを実行するための最良の方法は何ですか?

14
...
var $rootScope;
beforeEach(inject(function(_$rootScope_) {
  $rootScope = _$rootScope_;
}));
...
21
Markus Coetzee

Provide()を使用すると、新しい$ 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);
    }
}
6

含めるangular-mocks.js、次に angular.mock.inject

3
L42y

これが同様の問題の解決策だったので、これが他の人に役立つことを願っています。

var rootValGetterService;

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

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

これが私がしたことです:

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

テストケースを含め、より詳細な回答をしてみてください。

.。

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
Juanyi

$scopeを挿入する場合のように新しいスコープを作成する代わりに、必要なプロパティを$rootScopeに直接モックすることができます。

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

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

次のコードは、例で機能するはずです。

beforeEach(inject(function($rootScope) {
    $rootScope.specialValue = 'whatever';
}));
0
Amy Pellegrini