2016-04-25 3 views
1

Я бы хотел протестировать мой angular service Я бы хотел протестировать его с помощью реальных данных - a.k.a (Integration Test). Я использую Жасмин и Карму.Интеграционное тестирование AngularJS + Karma + Jasmine

Вот мой тест:

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'); 
    }); 
    }); 
} 

Это ошибка: Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

Я попытался широкий спектр решений, и я не получил никакого успеха с этим.

EDIT: 29/апрель/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); 

ответ

1

Карма не предназначена для тестирования интеграции. Ваш вызов модуля («водопад») на самом деле является ссылкой на angular.mock.module, который издевается над всеми вызовами $ https.

Вам необходимо использовать некоторую форму сквозного тестирования для тестирования с реальными данными. Я предлагаю http://angular.github.io/protractor/#/.

+0

Я согласен, вы также можете посмотреть http://www.seleniumhq.org/ для наборов и тестов автоматизации регрессии на основе браузера –

+0

Как это сделать, если я хочу проверить свою конкретную услугу, не перейдя на e2e? Я не хочу знать, связаны ли конкретные данные. Я хочу знать, что данные есть и привязаны к конкретной логике в конкретной службе. Как и в C#. – IamStalker

Смежные вопросы