コントローラをユニットテストしたいです。私はAPIを期待する基本的なテストアサーションから始めました。しかし、私は条件チェックの中でスコープメソッドを嘲笑することに挑戦しています。スコープの下で利用できないのでundefined
エラーが発生しました。グローバルlogout()
メソッドしか利用できません。カルマエラー - 定義されていないと予想されます。
をspyOn
として真似してみましたが、それでも役に立たないです。どんな解決策が私をキックスタートさせるのに大いに役立つでしょう。
コントローラー:
angular.module('app').controller('sampleCtrl',
function($scope, $state, $http, $rootScope, localStorageService) {
if (!(localStorageService.get('isAuthenticated'))) {
$state.go('home');
}
if (localStorageService.get('isAuthenticated') === true) {
//http post calls made here to perform certain operation on page load
$scope.someMethod = function(){
//do something
}
}
$scope.logOut = function() {
localStorageService.set('property', '');
localStorageService.set('isAuthenticated', false);
$state.go('home');
};
});
カルマ:
'use strict';
describe('Controller: sampleCtrl', function() {
/** to load the controller's module */
beforeEach(module('app'));
var sampleCtrl,scope,httpBackend,deferred,rootScope;
beforeEach(inject(function ($controller,_$rootScope_,$httpBackend,$q) {
var store = {};
scope= _$rootScope_.$new(); // creates a new child scope of $rootScope for each test case
rootScope = _$rootScope_;
localStorageService = _localStorageService_;
httpBackend = $httpBackend;
httpBackend.whenGET(/\.html$/).respond('');
spyOn(localStorageService, 'set').and.callFake(function (key,val) {
store[key]=val;
});
spyOn(localStorageService, 'get').and.callFake(function(key) {
return store[key];
});
sampleCtrl = $controller('sampleCtrl',{
_$rootScope_:rootScope,
$scope:scope,
$httpBackend:httpBackend,
_localStorageService_:localStorageService
// add mocks here
});
localStorageService.set('isAuthenticated',true);
}));
/**ensures $httpBackend doesn’t have any outstanding expectations or requests after each test*/
afterEach(function() {
httpBackend.verifyNoOutstandingExpectation();
httpBackend.verifyNoOutstandingRequest();
});
it('sampleCtrl to be defined:',function(){
httpBackend.flush();
expect(sampleCtrl).toBeDefined();
});
// failing test case - scope.someMethod not available in scope
it('is to ensure only authenticated user can access the state methods',function(){
localStorageService.get('isAuthenticated');
httpBackend.flush();
expect(scope.someMethod).toBeDefined();
});
});
_someMethod_を_if_の外に定義して、それを動作させるために必要なパラメータを渡すのはなぜですか? –
@min che:もし私が間違っていたら私を修正してください..私の意図は、認証されたユーザーのためだけにそのメソッドを実行することです..私はテストのためにそれを外しています...それを無視していませんか?また、なぜそれが動作していないと、それを回避するために行くの代わりに働くことを理解しようとしている.. – RVR