次の(簡単な)サービスのように、$ rootScopeの値に依存するサービスがあるとします。
angular.module('myServices', [])
.factory('rootValGetterService', function($rootScope) {
return {
getVal: function () {
return $rootScope.specialValue;
}
};
});
$ rootScopeに値を入れてこれを単体テストしたい場合、それを実行するための最良の方法は何ですか?
...
var $rootScope;
beforeEach(inject(function(_$rootScope_) {
$rootScope = _$rootScope_;
}));
...
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);
}
}
含めるangular-mocks.js
、次に angular.mock.inject
:
これが同様の問題の解決策だったので、これが他の人に役立つことを願っています。
var rootValGetterService;
beforeEach(inject(function($rootScope,$injector) {
$rootScope.specialValue = "test";
rootValGetterService= $injector.get('rootValGetterService');
}));
it("Should have a service", function () {
expect(rootValGetterService).toBeDefined();
});
これが私がしたことです:
it('some kind of wacky test', function($rootScope, Translate){
$rootScope.lang = 'en';
expect(Translate('overview').toBe('Overview');
}
テストケースを含め、より詳細な回答をしてみてください。
.。
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);
}
$scope
を挿入する場合のように新しいスコープを作成する代わりに、必要なプロパティを$rootScope
に直接モックすることができます。
次に、$rootScope
に、テストしているコードで使用可能なプロパティが挿入されます。
少なくともこれは私が同じ問題を解決した方法です。
次のコードは、例で機能するはずです。
beforeEach(inject(function($rootScope) {
$rootScope.specialValue = 'whatever';
}));