2015-11-01 15 views
5

Come si può prendere in giro un semplice Factory in AngularJs che restituisce dati statici in un test dell'unità Karma?Angularjs prova fabbrica semplice che restituisce dati statici

ho questo semplice fabbrica, che per il bene di esempio restituire i dati statici:

angular.module('conciergeApp.services') 
     .factory('CurrentUser', function() { 
     return { 
      id: 1, 
      hotel_id: 1, 
     } 
     }); 

Mi piacerebbe sapere come scrivere un test Karma per questo?

Finora, ho questo codice, ma id non funziona:

describe('ReplyCtrl', function() { 

    beforeEach(module('conciergeApp')); 

    beforeEach(module(function($provide) { 
     $provide.service('CurrentUser', function() { 
      return 1; 
     }); 
    })); 

    //Getting reference of the mocked service 
    var mockUtilSvc; 

    inject(function(CurrentUser) { 
     mockUtilSvc = CurrentUser; 
    }); 

    beforeEach(inject(function($rootScope, $controller) { 
     scope = $rootScope.$new(); 
     ctrl = $controller('ReplyCtrl', { 
      $scope: scope 
     }); 
    })); 

    it('should return value from mock dependency', inject(function(mockUtilSvc) { 
     expect(mockUtilSvc()).toEqual(1); 
    })); 

}); 

Questo è il messaggio di errore che sto ricevendo:

Firefox 41.0.0 (Mac OS X 10.10.0) ReplyCtrl should return value from mock dependency FAILED 
    Error: [$injector:unpr] Unknown provider: mockUtilSvcProvider <- mockUtilSvc 

risposta

4

1) Hai inject nel posto sbagliato. Stai specificando la funzione di iniezione nel test it, basta rimuoverlo.

cioè

it('should return value from mock dependency', inject(function(mockUtilSvc) { 
    expect(mockUtilSvc()).toEqual(1); 
})); 

sarebbe diventato

it('should return value from mock dependency', function() { 
    expect(mockUtilSvc()).toEqual(1); 
}); 

2) Ora il problema è che mockUtilSvc è un'istanza di servizio e non una funzione, secondo la vostra definizione, anche sulla base di vostro finto è necessario definirlo come fabbrica (cioè si restituisce 1 come valore di fabbrica e non è new in grado).

beforeEach(module(function($provide) { 
    $provide.factory('CurrentUser', function() { 
     return 1; 
     //If you expect factory to be a function then you need to return a function returning 1 here 
    }); 
})); 

e

expect(mockUtilSvc).toEqual(1); 

3) Si potrebbe così scrivere questo come:

$provide.value('CurrentUser', 1); //Provide the instance here right away 

4) La tua prima inject è anche in posto sbagliato. Lo stai solo eseguendo, ma non eseguendo e assegnando l'istanza durante ogni esecuzione di specifiche. before Each iterazione è necessario impostare il valore di istanza di servizio per la variabile, vale a dire:

beforeEach(inject(function(CurrentUser) { 
    mockUtilSvc = CurrentUser; 
})); 

Un test di esempio:

describe('ReplyCtrl', function() { 
    var mockData = { 
      id: 1234, 
      hotel_id: 1, 
     }, mockUtilSvc, scope, ctrl ; 


    beforeEach(module('conciergeApp', function($provide) { 
     $provide.value('CurrentUser', mockData); 
    })); 

    beforeEach(inject(function(CurrentUser, $rootScope, $controller) { 
     mockUtilSvc = CurrentUser; 
     scope = $rootScope.$new(); 
     ctrl = $controller('ReplyCtrl', { 
      $scope: scope 
     }); 
    })); 

    it('should return value from mock dependency', function() { 
     expect(mockUtilSvc.id).toEqual(mockData.id); 
    }); 
}); 

Demo

Nota: Non ci sono altri modi per prendere in giro e iniettare la finta. Ad esempio, in questo caso non è necessario utilizzare anche lo $provide.value. Invece è possibile creare il vostro oggetto fittizio e passarlo nel corso del esemplificazione controller come si ha il pieno controllo su lì per passare la dipendenza, come di seguito:

ctrl = $controller('ReplyCtrl', { 
      $scope: scope, 
      CurrentUser: mockUtilSvc 
    }); 

In caso di servizio più complesso con i metodi si potrebbe creare finto come Questo.

mockSvc = jasmin.createSpyObj('MyService', ['method1', 'method2']); 
    mockSvc.method1.and.returnValue($q.when(mockData)); //Simulating a promise returned from an $http call in the method. 
+1

Hist prima "iniettare" è anche nel posto sbagliato.Dovrebbe averlo in un 'beforeEach' – Phil

+0

@Phil True, lo ho menzionato nel passaggio 4, probabilmente non molto chiaro. lascia che lo aggiorni Grazie. – PSL

+0

@PSL ottima risposta, e grazie per la spiegazione approfondita. Questo rende molto più pulito ciò che sta succedendo qui e la logica alla base di come impostare questo test di simulazione. Grazie! –

Problemi correlati