2016-06-01 1 views
1

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!

+0

@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

+0

Cela définit simplement 'data' à indéfini. – westandy

+0

En outre, depuis que vous en avez parlé, quels problèmes voyez-vous avec le code de service? Merci pour toute contribution. – westandy

Répondre

1

Si je comprends votre intention avec le test correctement, je crois que c'est ce que vous avez besoin:

describe('Test Module', function() { 

    var $httpBackend, service; 

    beforeEach(module('TestService')); 

    beforeEach(inject(function(_$httpBackend_, _TestService_) { 
     $httpBackend = _$httpBackend_; 
     service = _TestService_; 
    })); 

    afterEach(function() { 
     $httpBackend.verifyNoOutstandingExpectation(); 
     $httpBackend.verifyNoOutstandingRequest(); 
    }); 

    it('should DoIt', function() { 
     var mockResponse = { 
      data: { success: true, message: "Yeah!" } 
     }; 

     $httpBackend.expectGET('/myroute/') 
      .respond(mockResponse); 

     service.DoIt().then(function(data) { 
      expect(data).toEqual(mockResponse); 
     }); 

     $httpBackend.flush(); 
    }); 

}); 
+0

Cela me donne "Expected [] à l'objet égal ({data: Object ({succès: vrai, message: 'Yeah!'})})", Qui est la même erreur que je recevais avant. Fondamentalement, cette "solution" change la syntaxe d'injection. Selon l'API d'Angular, nos deux syntaxes d'injection sont légitimes. – westandy

+0

Fondamentalement, cette "solution" passe sur ma machine en utilisant le code que vous avez collé pour votre service. –

+0

Il corrige également une faute de frappe dans la route de votre $ httpBackend.expectGET –

0

Dans mon cas, il y avait la fonction transformResponse sur $resource qui a modifié les données maquette attendu:

var resource = $resource('api/data/:id', {}, { get: { method: 'GET', isArray: true, transformResponse: function (data) { var d = angular.fromJson(data); return d.members; } } ...

Mes données de simulation ne contenaient pas de membres ...