2016-03-25 10 views
1

Ich kann diese beiden Spec-Dateien nicht gut miteinander spielen. Ich dachte nicht, dass Spec-Dateien andere Spec-Dateien beeinflussen würden, aber in diesem Fall scheint es so, als ob sie es tun würden, es ergibt für mich keinen Sinn.Angular Mocking in Jasmine Unbekannter Anbieter

Ich verwende Jasmin und Karma die Tests automatisiert mit Gulp
Der Fehler Ich erhalte ist "Unknown Anbieter: ProductServiceProvider < - Productservice"

I habe die Tests geändert, um das Problem zu beheben, hier sind die einfachen Versionen.

Wenn ich die folgende Zeile in Datei 2 auskommentieren, übergeben beide Dateien.

Es hat etwas mit dem Mocking des Moduls zu tun, aber ich kann nicht herausfinden, was ich hier falsch mache.

Spec-Datei 1

describe('Testing euProduct', function(){ 

var $factory; 
var $httpBackend; 

beforeEach(function() { 

    //modules 
    module('eu.product.service'); 

    //injections 
    inject(function($injector){ 
     $factory = $injector.get('ProductService'); 
     $httpBackend = $injector.get('$httpBackend'); 
    }); 

    //mock data 
    $httpBackend.when('GET', '/Mercury/product/list/0/0?PrimaryCategoryID=0&pageSize=20&startPage=1').respond({ 
     "data": 
      [{ 
       "recallid":45, 
      }] 
    }); 

}); 

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

it('Should be able to get data from the server on default parameters.', function(){ 
    $factory.list({},function(data){ 
     expect(data.data[0].recallid).toBe(45); 
    }); 
    $httpBackend.flush(); 
}); 

}); 

Spec-Datei 2

'use strict'; 

beschreiben ('Testing euProduct Logic', function() {

//variables in closure scope so they can be used in tested but set with injection in beforeEach 
var $factory; 

//mocking a module :: http://www.sitepoint.com/mocking-dependencies-angularjs-tests/ 
beforeEach(function() { 
    angular.module('eu.product.service',[]); 

    module(function($provide) { 
     $provide.factory('ProductService', function() { 
      // Mocking utilSvc 
      return { 
       list : function(para, callback){ 
        callback({ 
         data : { 
          product : 'The product Name' 
         } 
        }) 
       } 
      }; 
     }); 

     $provide.service('storageSvc', function() { 
      // Mocking storageSvc 
     }); 
    }); 

    //modules 
    module('eu.product.logic'); 

    //injections 
    inject(function($injector){ 
     $factory = $injector.get('ProductLogic'); 
    }); 

}); 

//-----Tests---- 

it('Should be able to run tests', function(){ 
    expect(2).toBe(2); 
}); 
}); 
+0

Last tun Modul wie diese 'angular.module (‚eu.product.service‘)' –

+0

Ich drehe das Modul einge es nicht spöttisch so, wenn ein Fehler mit der EU ist. product.service-Modul wird nicht im eu.service.logic-Test angezeigt. Wie würden Sie es verspotten, anstatt es zu importieren? –

+0

Die Art und Weise, wie Sie gerade arbeiten, besteht darin, ein neues Modul zu erstellen, das alle registrierten Komponenten ausspült. Was wollten Sie in 'eu.product.service' vortäuschen? –

Antwort

1

Sowohl module und inject von angular-mocks Rückkehr Funktionen, die aufgerufen werden müssen

Im folgenden Beispiel habe ich diese Änderungen:

  • Umgestalten zu einem grundlegenden Arbeitsbeispiel
  • keine benutzerdefinierten $ -prefixed Variablen definieren Sie. Diese sind von eckigen vorbehalten.
  • inject anstelle von $injector verwenden.
  • Fügen Sie einige Kommentare für weitere Erklärungen hinzu.

    describe('ProductService', function() { 
        var ProductService; 
        var $httpBackend; 
    
        // Start module config phase. 
        beforeEach(module('eu.produce.service', function($provide) { 
         // Inject providers/override constants here. 
         // If this function is empty, it may be left out. 
        })) 
    
        // Kickstart the app and inject services. 
        beforeEach(inject(function(_ProductService_, _$httpBackend_){ 
         ProductService = _ProductService_; 
         $httpBackend = _$httpBackend_; 
        }); 
    
        beforeEach(function() { 
         // Optionally use another beforeEach block to setup services, register spies, etc. 
         // This can be moved inside of the inject function as well if you prefer. 
         //mock data 
         $httpBackend.when('GET', '/Mercury/product/list/0/0?PrimaryCategoryID=0&pageSize=20&startPage=1').respond({ 
          "data": 
           [{ 
            "recallid":45, 
           }] 
         }); 
        }); 
    
        afterEach(function() { 
         $httpBackend.verifyNoOutstandingExpectation(); 
         $httpBackend.verifyNoOutstandingRequest(); 
        }); 
    
        //-----Tests---- 
    
        it('Should be able to get data from the server on default parameters.', function(){ 
         ProductService.list({},function(data){ 
          expect(data.data[0].recallid).toBe(45); 
         }); 
         $httpBackend.flush(); 
        }); 
    }); 
    
Verwandte Themen