Je vais juste commencer en disant que $ httpBackend et spyOn sont assez nouveaux pour moi, et j'ai du mal à avoir une image claire de ce qui se passe. En fait, je suis en train de faire une $ httpBackend.expectGET ('/ MyRoute /'). Répondre (...) puis utiliser spyOn, mais je continue à obtenir
Expected [ ] to equal Object({ success: true, message: 'Yeah!' })
Voici le code Je suis en train de tester:
angular.module('TestModule')
.service('TestService',TestService);
TestService.$inject = ['$http'];
function TestService($http){
var service = {};
service.DoIt = DoIt;
return service;
function DoIt() {
return $http.get('/myroute/')
.then(handleSuccess,handleError('Error happened!'));
}
function handleSuccess(res) {
return res.data;
}
function handleError(error) {
return function(){
return {success: false, message: error}
};
}
}
Voici mon test Karma-Jasmine:
describe('Test Module',function(){
beforeEach(module('TestModule'));
describe('TestService Tests',function(){
var service,$httpBackend;
beforeEach(inject([
'$injector',
function($injector){
$httpBackend = $injector.get('$httpBackend');
service = $injector.get('TestService');
}
]));
afterEach(function(){
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('should DoIt',function(){
var mockResponse = {
data : {success:true, message:"Yeah!"}
};
$httpBackend.expectGET('/myroute')
.respond(Promise.resolve(mockResponse));
spyOn(service,'DoIt').and.callThrough();
service.DoIt().then(function(data){
expect(service.DoIt).toHaveBeenCalled();
expect(data).toEqual(mockResponse.data); <-- ERROR OCCURS HERE -->
});
$httpBackend.flush();
});
});
});
informations complémentaires:
En utilisant l'exemple que je trouve ici: http://www.bradoncode.com/blog/2015/06/26/unit-testing-http-ngmock-fundamentals/, j'ai essayé dans mon code de test:
it('should DoIt',inject(function($http){
var promise = $http.get('/myroute').then(handleSuccess,handleError('bad stuff happened'));
promise.then(function(data){
console.log('Data: ' + JSON.stringify(data,null,3));
});
$httpBackend.expect('GET','/myroute').respond(200,{data:'Yeah!'});
$httpBackend.flush();
}));
function handleSuccess(response) {return response.data;}
function handleError(error){
return function(){
return {success:false,message:error};
};
}
Cela me donne la réponse que je pense: «données: { "data": "oui"}
Ma question mise à jour: Je pensais que service.DoIt() faisait la même chose que la promesse. Qu'est-ce qui se passe ici? Est-ce que je n'injecte pas mon service? Je ne comprends pas comment Karma s'attend à ce que je passe ce test. Toute aide, s'il vous plaît!
@jbrown - Je suppose que c'est là que la syntaxe obtient moi. Je pensais que je le transmettais. Je pensais que mon $ httpBackend.expectGET ('/ myroute'). Respond (...) prenait en charge le $ http.get ('/ myroute') dans DoIt(). Je pensais que mon mockResponse serait alors passé à handleSuccess() et qu'il avait une propriété 'data'. Mais ce n'est pas ce qui se passe ici? – westandy
Cela définit simplement 'data' à indéfini. – westandy
En outre, depuis que vous en avez parlé, quels problèmes voyez-vous avec le code de service? Merci pour toute contribution. – westandy