Подтвердить что ты не робот

Как вставить $rootScope в AngularJS unit test?

Предположим, что у меня есть служба, которая зависит от значения в $rootScope, как со следующей (тривиальной) службой:

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

Если я хочу unit test, это, поместив значение в $rootScope, как лучше всего это сделать?

4b9b3361

Ответ 1

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

Ответ 2

Используя функцию обеспечения(), вы можете ввести новый $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);
    }
}

Ответ 3

Включить angular-mocks.js, затем используйте angular.mock.inject:

Ответ 4

Просто попробуйте дать более подробный ответ, включая тестовый пример:

...

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);
    }

Ответ 5

Вот что я сделал:

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

Ответ 6

Надеюсь, это поможет другим, так как это решение аналогичной проблемы.

var rootValGetterService;

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

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

Ответ 7

Вместо того, чтобы создавать новую область, как если бы вы вводили $scope, вы можете высмеять свойства, которые вам нужны, непосредственно в $rootScope.

Затем $rootScope будут введены те свойства, которые доступны в тестируемом коде.

По крайней мере, так я решил ту же проблему.

Следующий код должен работать в вашем примере.

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