2016-12-31 39 views
0

我很困惑AngularJS $資源服務應該被用於測試的方式。 我發現了兩種使用$ httpBackend服務的方法。 一種方式(從Pluralsight教程拍攝):

describe('test', function() { 

    beforeEach(module('name')); 

    it('text', inject(function($httpBackend) { 
     $httpBackend.expectGET("/url"); 
     // some code 
     $httpBackend.flush(); 
    }); 
} 

的其他方式(從this SO answer複製):

describe('test', function() { 
    var $httpBackend; 
    beforeEach(angular.mock.module('name')); 

    beforeEach(function() { 
     angular.mock.inject(function ($injector) { 
      $httpBackend = $injector.get('$httpBackend'); 
     }) 
    }); 

    describe('text', function() { 
     it('text', inject(function (User) { 
      $httpBackend.expectGET('/url') 
       .respond([{ 
        property: 'test' 
       }]); 

      // Some code 

      $httpBackend.flush(); 
     })); 

    }); 
}); 

我不明白爲什麼第一種方式,使用模塊直接而第二種方法是angular.mock.module。然後httpBackend服務被注入如此不同。第二種方式更加冗長。如果第一種方法有效,第二種方式的所有冗長點有什麼意義?

+0

'module'是'angular.mock.module快捷方式'。後者可用於避免與CommonJS模塊衝突。如果相同的服務應該用於多個規格,則使用'beforeEach'。 – estus

+0

謝謝。但至於_beforeEach_,我明白,但我不明白爲什麼在第一種情況下足夠使用_inject(function($ httpBackend)_並且在第二種情況下,_angular.mock.inject(function($ injector)_ is用過的。 – user5080246

回答

1

有沒有正確的方法,這裏有幾個不同的問題應該記住。

moduleangular.mock.module的快捷方式。後者可用於避免與CommonJS模塊衝突。

爲什麼angular.mock.inject在那裏使用的唯一原因是與angular.mock.module一致,它總是可以安全地縮短爲inject

beforeEach(inject(...))用於相同的服務應該用於多個規格。

beforeEach(function() { inject(...) })beforeEach(inject(...))的詳細版本。如果在beforeEach塊中除inject之外還有其他內容,請考慮將其拆分爲幾個beforeEach塊,以便於閱讀。

$injector.get只是冗長的,在風格或功能方面沒有任何好處。它什麼都不做一件好事,如果服務是變量,但它提供了對this規格方面分配批量服務的有用模式沒有列舉他們幾次:

beforeEach(inject(function ($injector) { 
    var self = this; 

    ['$httpBackend', ...].forEach(function (depName) { 
    self[depName] = $injector.get(depName); 
    }); 
})); 

it(function() { 
    var self = this; 

    self.$httpBackend... 
});