2014-11-10 2 views
0

Я использую AngularJS 1.2.16 с Jasmine 2.X для моих спецификаций javascript.
Но они быстро стали беспорядочными. Мне сложно найти информацию о том, как реорганизовать и структурировать спецификации.AngularJS - Как я могу обновить спецификации Jasmine?

Вот некоторые плохие характеристики шахты:

channel = mockRestangular = $httpBackend = deferred = undefined 
    channel_id = {...} 

    beforeEach -> 
    module("channels", ($provide) -> 
     mockRestangular = { 
     configuration: { baseUrl: "" } 
     one: -> 
      this 
     post: -> 
      this 
     put: -> 
      this 
     ... 
     } 

     module ($provide) -> 
     $provide.value('Restangular', mockRestangular) 
     return 
    ) 

    beforeEach inject((_channel_, $q, $injector) -> 
    channel = _channel_ 
    $httpBackend = $injector.get('$httpBackend') 
    deferred = $q.defer() 
) 

    it "spec1", inject(($q, $rootScope) -> 
     deferred = $q.defer() 
     spyOn(mockRestangular.one().one(), 'get').and.returnValue(deferred.promise) 
     spyOn(channel::, 'init').and.stub() 
     new_channel = new channel(channel_id) 
     new_channel.updateCount() 
     deferred.resolve({"channels":[{...long...long...object...}]}) 
     $rootScope.$digest() 
     expect(new_channel.meta.totalProducts).toEqual(24849) 
     expect(new_channel.meta.activeProducts).toEqual(1349) 
    ) 

    it "spec2", inject(($q, $rootScope) -> 
     deferred = $q.defer() 
     spyOn(mockRestangular.one().one(), 'get').and.returnValue(deferred.promise) 
     spyOn(channel::, 'init').and.stub() 
     new_channel = new channel(channel_id) 
     new_channel.updateStatisticsRevenue() 
     deferred.resolve({"revenue_statistics":[{...another...very...very...long...object...}]}) 
     $rootScope.$digest() 
     expect(new_channel.statistics.revenue).toEqual([{...kinda...long...object...result...}]) 
    ) 

    # spec with real respond-mock objects 
    describe "describtor2", -> 
    it "spec3", inject(($rootScope) -> 
    $httpBackend.expectPUT().respond(201, 
    {products:[{"sku":"10413161","active":false,"min_price":{"fractional":400,"currency":"EUR"},"max_price":{"fractional":950,"currency":"EUR"}},{"sku":"10413162","active":true,"min_price":{"fractional":458,"currency":"EUR"},"max_price":{"fractional":799,"currency":"EUR"}}]}) 
    spyOn(mockRestangular.one().one(), 'get').and.returnValue(deferred.promise) 
    spyOn(channel::, 'init').and.stub() 
    new_channel = new channel channel_id 
    new_channel.updateProducts() 
    new_channel.getMeta().activeProducts = 2 
    expect(mockRestangular.one().one().get).toHaveBeenCalled 
    deferred.resolve({"products":[{"sku":"10413161","active":true,"min_price":{"fractional":412,"currency":"EUR"},"max_price":{"fractional":890,"currency":"EUR"}},{"sku":"10413162","active":true,"min_price":{"fractional":448,"currency":"EUR"},"max_price":{"fractional":799,"currency":"EUR"}}]} 
    ) 
    $rootScope.$digest() 
    new_channel.updateProduct([{sku:"10413161",active:false,min_price:{fractional:400,currency:"EUR"},max_price:{fractional:950,currency:"EUR"}},{"sku":"10413162","active":true,"min_price":{"fractional":458,"currency":"EUR"},"max_price":{"fractional":799,"currency":"EUR"}}]) 
    $httpBackend.flush() 
    expect(new_channel.getProducts()).toEqual(
[{"sku":"10413161","active":false,"min_price":{"fractional":400,"currency":"EUR"},"max_price":{"fractional":950,"currency":"EUR"}},{"sku":"10413162","active":true,"min_price":{"fractional":458,"currency":"EUR"},"max_price":{"fractional":799,"currency":"EUR"}}] 
    ) 
    expect(new_channel.getMeta().activeProducts).toBe(1) 
) 

Потому что они так долго со всеми объектами в них я даже начать уделять больше «ожидает» в единую спецификацию. Я знаю, что это неправильно, но я боюсь этих огромных спецификаций.

Есть ли какие-либо рекомендации по структурированию или рефакторингу спецификаций Жасмина?

ответ

1

Используйте BeforeEach поставить некоторый начальный общий код каждой спецификации, например, вы можете поместить эти строки:

 deferred = $q.defer() 
     spyOn(mockRestangular.one().one(), 'get').and.returnValue(deferred.promise) 
     spyOn(channel::, 'init').and.stub() 
     new_channel = new channel(channel_id) 

в BeforeEach, связанный с соответствующей describe.

beforeEach(function() { 
     deferred = $q.defer(); 
     spyOn(mockRestangular.one().one(), 'get').and.returnValue(deferred.promise); 
     spyOn(channel::, 'init').and.stub(); 
     new_channel = new channel(channel_id); 
}); 

Другая альтернатива: создать базовую функцию javascript для сбора общего кода. Преимущество будет то, что вы могли бы имя те части кода:

function mockDBGet() { 
      deferred = $q.defer(); 
      spyOn(mockRestangular.one().one(), 'get').and.returnValue(deferred.promise); 
} 

function initChannel() { 
      spyOn(channel::, 'init').and.stub(); 
      new_channel = new channel(channel_id); 
} 
//....... 
it('myCurrentSpec', function(){ 
    mockDBGet(); 
    initChannel(); far more clean than your previous version 
}); 
+0

Это 'beforeEach' хорошо. Для всех, кто не знал - как и я, каждый из них может иметь свои функции 'beforeEach'. Этот другой альтернативный звук интересный, не могли бы вы привести пример/дальнейшую ссылку? –

+0

Обновлен с примерами. – Mik378

+0

Ohh ja. Это красиво. У вас есть некоторые мысли о том, как обращаться с более крупными объектами макета-ответа? Я думаю, если бы мы могли добавить это, вы предоставили A + ответ, касающийся всех моих вопросов для меня и возможных других. –

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