2016-04-25 15 views
1

Ich möchte meine angular service testen Ich möchte es mit echten Daten testen - a.k.a (Integrationstest). Ich benutze Jasmin und Karma.Integrationstest AngularJS + Karma + Jasmin

Hier ist mein Test:

describe('Trending Data Service', function() { 
    var value = 0, originalTimeout = 0; 
    var service, Enums, $httpBackend; 

    // initialize module 
    beforeEach(module('waterfall')); 

    // initialize services 
    beforeEach(inject(function ($injector) { 
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; 
    $httpBackend = $injector.get('$httpBackend'); 
    service = $injector.get("trendingService"); 
    Enums = $injector.get("Enums"); 
    spyOn(service, 'fetch').and.callThrough(); 
    })); 

    it('check if dependencies are defined', function() { 
    expect(service).toBeDefined(); 
    expect(Enums).toBeDefined(); 
    expect(service.categories).toBeDefined(); 
    expect(service.fetch).toBeDefined(); 
    }); 

    it('categories array should be defined within the service', function() { 
    expect(service.categories.length).toEqual(9); 
    expect(service.categories).toEqual(jasmine.any(Array)); 
    }); 

    // this test is alway fails... 
    it('fetch method should return initial result', function (done) { 
    var promise = service.fetch(Enums.socials.viewAll, false); 

    promise.then(function (result) { 
     done(); 
    }, function() { 
     expect(1).toBe(2); 
     done.fail('Error occured'); 
    }); 
    }); 
} 

Dies ist der Fehler: Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

habe ich versucht, eine breite Palette von Lösungen, und ich habe keinen Erfolg mit diesem bekam.

EDIT: 29/April/2016

var trendingService = function ($q, $http) { 
    var deferred = $q.defer(); 
    var $this = this; 
    this.fetch = function (id) { 
     $http.get(url).then(function (result) { 
      deferred.resolve(result); 
     }).catch(function(err) { 
      deferred.reject(err); 
     }); 
     return deferred.promise; 
    } 
    return { 
     fetch: $this.fetch; 
    }; 
}; 

var Enums = { 
    Roles: { 
     Admin: 1, 
     User: 2, 
     NotRegistered: 0 
    } 
}; 

angular.module('').const('Enums', Enums); 

Antwort

1

Karma ist nicht für die Integrationstests gedacht. Ihr Aufruf an das Modul ('Wasserfall') ist eigentlich eine Referenz auf angular.mock.module, die alle $ https Aufrufe verspottet.

Sie müssen eine Form von End-to-End-Tests verwenden, um mit echten Daten zu testen. Ich schlage vor, http://angular.github.io/protractor/#/.

+0

Ich stimme zu, Sie könnten auch auf http://www.seleniumhq.org/ für browserbasierte Regression Automatisierung Suiten und Tests –

+0

Wie hilft es, wenn ich meinen konkreten Service zu überprüfen, ohne e2e gehen? Ich will nicht wissen, ob die konkreten Daten gebunden sind. Ich möchte wissen, dass Daten da sind und an spezifische Logik im konkreten Dienst gebunden sind. Wie ich es bei C# -Tests mache. – IamStalker

Verwandte Themen