Ответ 1
...
var $rootScope;
beforeEach(inject(function(_$rootScope_) {
$rootScope = _$rootScope_;
}));
...
Предположим, что у меня есть служба, которая зависит от значения в $rootScope, как со следующей (тривиальной) службой:
angular.module('myServices', [])
.factory('rootValGetterService', function($rootScope) {
return {
getVal: function () {
return $rootScope.specialValue;
}
};
});
Если я хочу unit test, это, поместив значение в $rootScope, как лучше всего это сделать?
...
var $rootScope;
beforeEach(inject(function(_$rootScope_) {
$rootScope = _$rootScope_;
}));
...
Используя функцию обеспечения(), вы можете ввести новый $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);
}
}
Включить angular-mocks.js
, затем используйте angular.mock.inject
:
Просто попробуйте дать более подробный ответ, включая тестовый пример:
...
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);
}
Вот что я сделал:
it('some kind of wacky test', function($rootScope, Translate){
$rootScope.lang = 'en';
expect(Translate('overview').toBe('Overview');
}
Надеюсь, это поможет другим, так как это решение аналогичной проблемы.
var rootValGetterService;
beforeEach(inject(function($rootScope,$injector) {
$rootScope.specialValue = "test";
rootValGetterService= $injector.get('rootValGetterService');
}));
it("Should have a service", function () {
expect(rootValGetterService).toBeDefined();
});
Вместо того, чтобы создавать новую область, как если бы вы вводили $scope
, вы можете высмеять свойства, которые вам нужны, непосредственно в $rootScope
.
Затем $rootScope
будут введены те свойства, которые доступны в тестируемом коде.
По крайней мере, так я решил ту же проблему.
Следующий код должен работать в вашем примере.
beforeEach(inject(function($rootScope) {
$rootScope.specialValue = 'whatever';
}));