Ich möchte meinen Controller testen. Ich begann mit grundlegenden Testaussagen der expect API. Aber ich stehe vor der Herausforderung, innerhalb einer konditionellen Prüfung die Umfangsmethoden zu verspotten. Ich erhalte einen undefined
Fehler, da er nicht unter dem Bereich verfügbar ist, nur die globale -Methode ist verfügbar.Karma-Fehler - Erwartet undefiniert, um definiert zu werden
Ich versuchte, die localStorageService
mit spyOn
als wahr zu verspotten, um die Bedingung zu erfüllen, aber das ist immer noch keine Hilfe. Jede Lösung wird eine große Hilfe sein, um mich zum Kickstarter zu machen.
Controller:
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');
};
});
Karma:
'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();
});
});
Warum definieren Sie _someMethod_ nicht außerhalb von _if_ und übergeben Sie einfach die Parameter, die dafür benötigt werden? –
@min che: korrigieren Sie mich, wenn ich falsch liege .. meine Absicht ist, diese Methode nur für die authentifizierten Benutzer ausführen .. wenn ich es aus dem Zustand für Testzwecke verschieben..ist es nicht trotzt es? Auch ... ich versuche zu verstehen, warum es nicht funktioniert und wie man es funktioniert ... anstatt für einen Workaround dafür zu gehen .. – RVR