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 回答
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);
    }
于 2015-04-22T05:12:28.507 回答
0

这是我所做的:

it('some kind of wacky test', function($rootScope, Translate){
    $rootScope.lang = 'en';
    expect(Translate('overview').toBe('Overview');
}
于 2015-06-03T19:13:37.297 回答
0

希望这对其他人有所帮助,因为这是解决类似问题的方法。

var rootValGetterService;

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

it("Should have a service", function () {
    expect(rootValGetterService).toBeDefined();
});
于 2015-07-10T18:51:57.907 回答