15

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

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

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

4

7 に答える 7

22
...
var $rootScope;
beforeEach(inject(function(_$rootScope_) {
  $rootScope = _$rootScope_;
}));
...
于 2014-11-28T13:52:44.703 に答える
6

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);
    }
}
于 2013-03-14T17:21:19.487 に答える
3

を含めangular-mocks.jsてから使用しますangular.mock.inject

于 2013-03-15T15:20:34.957 に答える
2

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

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

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

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

beforeEach(inject(function($rootScope) {
    $rootScope.specialValue = 'whatever';
}));
于 2016-04-25T14:14:32.743 に答える