簡體   English   中英

AngularJS-如何重構我的Jasmine規格?

[英]AngularJS - How can i refactore my Jasmine specs?

我將AngularJS 1.2.16和Jasmine 2.X一起用於我的JavaScript規范。
但是他們很快變得凌亂。 我很難找到有關如何重構和構造規格的信息。

這是我的一些不好的規格:

  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)
)

因為它們包含所有對象的時間太長了,所以我什至開始將更多“期望”放入一個規范中。 我知道這是錯誤的,但我擔心這些龐大的規格。

是否有構造或重構Jasmine規格的最佳實踐?

使用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
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM