2016-04-07 6 views
1

Ich versuche, die Testkasse für die Fabrik zu schreiben, die eine JSON-Antwort zurückgibt.Wie schreibe ich einen Testfall für JSON, der eine Formularfabrik in AngularJS bekommt

Aber ich erhalte die Fehlermeldung:

Fehler: [$ Injektor: UNPR]? http://errors.angularjs.org/1.4.1/ $ Injektor/UNPR p0 = serviceprovider% 20% 3C-% 20service bei Error (nativ)

Hier ist mein Code:

(function() { 
    angular.module('uspDeviceService',[]).factory('getDevice', GetDevice); 
    GetDevice.$inject = ['$http']; 
    function GetDevice($http) { 
      getDeviceList = function() { 
       return $http.get("static/test-json/devices/device-list.json"); 
      } 
     return { 
      getDeviceList: getDeviceList 
     } 
    } 
}()); 

-Code für Testfall:

describe('Get Product test', function() { 

    beforeEach(module('uspDeviceService')); 
    var service, httpBackend, getDevice ; 
    beforeEach(function() { 
     angular.mock.inject(function ($injector) { 
      //Injecting $http dependencies 
      httpBackend = $injector.get('$httpBackend'); 
      service = $injector.get('service'); 
      getDevice = $injector.get('getDevice'); 
     }) 
    }); 
    console.log('Injection Dependencies is done'); 

    describe('get Device List', function() { 
     it("should return a list of devices", inject(function() { 
      httpBackend.expectGET("static/test-json/devices/device-list.json").respond("Response found!"); 

      httpBackend.flush(); 
     })) 
    }) 

}); 

Ich bin neu in Eckige Unit-Tests, kann jemand bitte helfen Sie mir, wo ich falsch werde ..

Antwort

1

Zwei Dinge, die mich herausspringen:

  • Ihre angular.module Erklärung ist definiert ein Modul, nicht bekommen das Modul. Ich würde Sie ermutigen, das aufzuteilen, damit es klarer ist, was Ihre Absicht ist.

    Es funktioniert wahrscheinlich wie es ist, aber Klarheit ist wichtig.

  • Was ist ... service? Es ist nirgends in Ihrem Code definiert und Angular kann es auch nicht finden, daher die Fehlermeldung. Möglicherweise suchen Sie stattdessen nach getDevice. Benennen Sie auch Ihre Testvariable in Bezug auf das, was sie tatsächlich ist, damit Sie sich nicht verwirren.

    // defined above 
    var getDevice; 
    
    // while injecting 
    getDevice = $injector.get('getDevice'); 
    
+0

Ok tun kann ich es bekommen habe und dann, wie zu testen, ob JSON kommt oder nicht? –

+0

@AnitaMehta: Da dies ein Komponententest ist, möchten Sie annehmen, dass JSON immer genau zurückkommt. Wenn Sie den tatsächlichen Live-Endpunkt testen möchten, dann zwei Worte der Vorsicht: Da es von einem Dritten stammt, wird es brüchig sein, und diese Art von Tests werden am besten einem End-to-End-Test überlassen. – Makoto

+0

Ich möchte nur überprüfen, ob Daten von der Fabrik zurückkommt, das ist alles –

1

der Annahme, dass Sie ein AngularJS Controller MyController in MyModule definiert haben. Der Controller führt eine Aktion aus, wenn der api-Aufruf erfolgreich ist, und zeigt eine Flash-Nachricht an, wenn api den Erfolg success = false zurückgibt. Der Ihre Controller-Code wäre jetzt so etwas wie

angular.module('myModule') 

.controller('myController', function ($scope,flashService, Api) { 


    Api.get_list().$promise.then(function(data){ 
    if(data.success) { 
     $scope.data = data.response 
    } 
    else{ 
     flashService.createFlash(data.message, "danger"); 
    } 
    }); 

}); 

beide Erfolg zu testen = true und Erfolg = false wir

describe('myController', function(){ 

    var $rootScope, $httpBackend, controller, flashService; 

    var apilink = 'http://apilink'; 

    beforeEach(module('myModule')); 

    beforeEach(inject(function(_$httpBackend_,_$rootScope_, _$controller_, _flashService_) { 

    $rootScope = _$rootScope_; 
    $httpBackend = _$httpBackend_; 
    flashService = _flashService_; 
    controller = _$controller_("myController", {$scope: $rootScope}); 

    })); 

it('init $scope.data when success = true', function(){ 
    $httpBackend.whenGET(apilink) 
    .respond(
    { 
    success: true, 
    response: {} 

    }); 

    $httpBackend.flush(); 
    expect($rootScope.data).toBeDefined(); 
}); 

it('show flash when api request failure', function(){ 

    spyOn(flashService, 'createFlash'); 

    $httpBackend.whenGET(apilink) 
.respond(
    { 
    success: false 
    }); 

    $httpBackend.flush(); 
    expect(flashService.createFlash).toHaveBeenCalled(); 

}); 


}); 

Sie werden immer die Antwort verspotten, weil wir hier den Javascript-Code zu testen sind Verhalten und wir sind nicht mit der Api betroffen. Sie können sehen, wenn die Daten initialisiert werden und wenn der Erfolg falsch ist, wird createFlash aufgerufen.

Soweit Test für Fabrik betrifft Sie

describe('Get Product test', function() { 

    beforeEach(module('uspDeviceService')); 
    var service, httpBackend, getDevice ; 
    beforeEach(function() { 
     inject(function ($injector) { 
     httpBackend = $injector.get('$httpBackend'); 
     service = $injector.get('service'); 
     getDevice = $injector.get('getDevice'); 
     }); 
    }); 

    describe('get Device List', function() { 
    it("should return a list of devices", inject(function() { 

     httpBackend.expectGET("static/test-json/devices/device- list.json").respond("Response found!"); 
     var result = getDevice.getDeviceList(); 
     httpBackend.flush(); 
     expect(result).toEqual('Response found!'); 

    })); 
    }); 

}); 
+0

Danke für die schnelle Antwort, aber hier versuche ich Fabrik Einzel nur für Testzwecke zu testen.Können Sie bitte sagen, was auch immer ich in der Fabrik schreibe, kann ich Testen Sie, indem Sie das Objekt in der JSON-Antwort vergleichen. –

+0

Test für Factory hinzugefügt – akniazi

+0

Nun bekomme ich diesen Fehler: Expected Object ({$$ state: Objekt ({Status: 1, Wert: Objekt ({data: 'Response found!', Status: 200, Header: Funktion, Konfig : Objekt ({metho amSerializer: Funktion, URL: 'statisch/test-json/devices/device-list.json', headers: Object ({Übernehmen: 'application/json, text/plain, */*'}) }), e gefunden! '. –

Verwandte Themen