2017-04-06 5 views
0

In AngularJs App möchte ich den AboutService in Jasmin testen. Die Über-Service gibt Daten in folgendem Format:In Jasmine, wie Service Antwort gegen statische Daten zu testen

var companyObject = [{"CompanyName": "A", "Contact Number" : "123456789"}, {"CompanyName": "B", "Contact Number" : "1234567899"}] 

angular 
    .module('TestModule') 
    .factory('aboutService', aboutService); 

    aboutService.$inject = ['$rootScope', '$http']; 

    function homeService($rootScope, $http) { 
     function getAboutData() { 
      return $http({ 
       method: "GET", 
       url: API URL, 
      }) 
      .then(getAboutDataSuccess); 

      function getAboutDataSuccess(results) { 
       return results;//Data about company telephone contact number in array 
      } 
     } 

     var aboutService = { 
      getAboutData: getAboutData, 
     }; 
    } 

In aboutServiceSpec, möchte ich testen, ob die durch API dh eine Arraylänge zurückgegebenen Daten größer als 0 und ist gleich ist gleich einer Variablen companyObject

Ich habe den folgenden Code mit Jasmine versucht, aber es funktioniert nicht.

describe("Service: aboutService", function() { 

     var aboutService, $httpBackend, $rootScope, response; 
     var companyObject = [{ "CompanyName": "A", "Contact Number": "123456789" }, { "CompanyName": "B", "Contact Number": "1234567899" }] 
     beforeEach(module('TestModule')); 

     beforeEach(inject(function (_$httpBackend_, _aboutService_, _$rootScope_) { 
      $httpBackend = _$httpBackend_; 
      aboutService = _aboutService_; 
      $rootScope = _$rootScope_; 
     })); 

     it('Should get about details of comapny', function() { 
      $httpBackend.expectGET('URL'); 
      //Donot know how to go forward from here 
     }); 
    }); 
+0

Verwendung $ httpBackend –

+0

@ DanielA.White vorgenommen: Ich habe versucht, die '$ httpBackend', wie ich in der Frage erwähnt. Aber ich bin nicht sicher, wie ich damit weitermachen soll. Kannst du ein bisschen erklären? – Quest

Antwort

1
$httpBackend.expectGET('URL').respond(companyObject); 
aboutService.getAboutData().then(function(result) { 
    expect(result).toEqual(...); //or whatever expectation you want to test 
}); 
$httpBackend.flush(); 

EDIT Was dieser Code tut, ist die folgende:

  1. $httpBackend.expectGET(...).respond(...) definiert eine Erwartung von dem, was den im Test befindlichen Code anfordert und verhöhnt die Antwort auf diese Anfrage
  2. Die Erwartungen gehen an einen .then Block, der an den Service angekuppelt wird, der vom Promis zurückgebracht wird e (an dieser Stelle wird das Versprechen der $http Anfrage noch nicht aufgelöst)
  3. $httpBackend.flush() löst das Versprechen mit dem Mock-Objekt früher angegeben (nur sind jetzt die Erwartungen im .then Block gefeuert). Es hat auch den Nebeneffekt den Test ungültig zu machen, wenn die erwartete Anfrage wird nicht
+0

Können Sie eine zusätzliche Erklärung für *** geben *** warum *** das ist die Lösung? –

+0

@crizzis: $ httpBackend.expectGET ('URL') ** ruft den Dienst nicht tatsächlich ** auf, sondern gibt nur ein statisches Objekt zurück. Und dann testen wir dieses statische Objekt gegen eine andere statische Bedingung. Also testen wir eigentlich nichts. – Quest

+0

Nicht wirklich. Wir testen gerade die Tatsache, dass 'aboutService.getAboutData' zurückgibt, was auch immer der Aufruf von '$ http' zurückgibt (es könnte sehr gut einen Aufruf von '$ http' machen und dann nichts zurückgeben, in welchem ​​Fall der Test fehlschlagen würde)). Und, was noch wichtiger ist, wir verifizieren, dass überhaupt eine "$ http" Anfrage gestellt wird * (andernfalls würde $ httpBackend.flush fehlschlagen). Offensichtlich ist der Test "dumm", aber auch die Methode - sie führt keine echte Logik aus. – crizzis

Verwandte Themen