6

L'applicazione My Angular 1.3 utilizza angular-translate library. Nei miei test di Karma sto tentando di deridere il provider $translate con un oggetto Mock che ho creato.Come deridere un provider

L'oggetto fittizio si chiama MockTranslate e appartiene al modulo myMocks. Non includo la fonte per MockTranslate nella domanda in quanto non è pertinente alla domanda.

Il tema del mio test è un controller e posso facilmente deridere $translate utilizzando il seguente:

module('myMocks'); 
inject(function($controller, MockTranslate) {                        
    $controller("MyController", {                           
    $translate: MockTranslate.create(translations);                       
    });                                  
}); 

È possibile che questo beffardo opere, tuttavia la mia preferenza sarebbe quella di prendere in giro il provider utilizzando il angular.mock.module con qualcosa di simile :

module('myMocks'); 
module("myModule", function($provide) {                          
    $provide.provider("$translate", function(MockTranslate) {                    
    return MockTranslate.create(translations);                      
    });                                  
}); 

ma ottengo il seguente errore quando ho eseguito il mio test:

Error: [$injector:modulerr] Failed to instantiate module function ($provide) due to: Error: [$injector:unpr] Unknown provider: MockTranslate

Come faccio a prendere in giro un fornitore utilizzando angular.mock.module?

risposta

19

Se ho capito il compito correttamente, ecco un esempio di lavoro:

angular.module('translateApp', []) 
    .controller('translateCtrl', function ($scope, $translate) { 
     $scope.translate = function(message) { 
      return $translate.translate(message); 
     }; 
    }) 
    .provider({ 
     $translate: function() { 
      this.$get = function() { 
       return { 
        translate: function (msg) { 
         return 'OriginalTranslate: ' + msg; 
        } 
       }; 
      }; 
     } 
    }); 

describe('Translate Controller Test', function() { 
    var mockScope; 
    var mockTranslate; 

    beforeEach(module('translateApp', function($provide) { 
     $provide.provider('MockTranslate', function() { 
      this.$get = function() { 
       return { 
        translate: function (msg) { 
         return 'MockTranslate: ' + msg; 
        } 
       }; 
      } 
     }); 

     $provide.provider('$translate', function() { 
      this.$get = function (MockTranslate) { 
       return { 
        translate: function (msg) { 
         return MockTranslate.translate(msg); 
        } 
       }; 
      } 
     }); 
    })); 

    beforeEach(inject(function($controller, $rootScope, $translate) { 
     mockScope = $rootScope.$new(); 
     mockTranslate = $translate; 

     $controller('translateCtrl', { 
      $scope: mockScope, 
      $translate: mockTranslate 
     }); 
    })); 

    it('Translates messages', function() { 
     expect(mockScope.translate('cool message')).toEqual('MockTranslate: cool message'); 
    }); 
}); 
+0

Grazie @sbedulin voi mi ha aiutato a capire che il provider necessaria per implementare una funzione di '$ GET'. – b73

+0

@ b73 benvenuto! Nota che anche le dipendenze vanno nella funzione '$ get'. Sarebbe bello se contrassegnassi la risposta come utile :) – sbedulin

+0

Grazie @sbedulin, sì hai anche portato alla mia attenzione che le dipendenze vanno nella funzione '$ get';) Ho aggiunto una risposta separata in quanto mostra la soluzione esatta che sono andato con. – b73