2015-04-21 47 views
5

在我的app.config中,我使用名爲ui-router-extras FutureStates的服務從REST調用的結果動態創建狀態。其中一個這樣做的副作用是,當我的測試運行,因爲我加載我的主要應用模塊中所有的人,所有的測試撥打電話到該服務,因此所有測試失敗,並嘲笑Angular和Jasmine中所有套件的全局HTTP請求

Error: Unexpected request: GET /api/v1/config 
No more request expected 

我可以將以下內容添加到我的測試套件中,並修復問題,並將此調用註冊到後端,以便期望它。

beforeEach(inject(function(_$httpBackend_){ 
    _$httpBackend_.whenGET(/\/api\/v1\/config.*/).respond([]); 
})); 

問題是這需要添加到每個測試套件中,這在我的模塊化應用程序中是很多溼碼。我正在尋找的是一種爲所有測試全局定義這種期望的方法(無論是在業力全球文件中,或者我甚至可以解決服務/單行導入以放入我的套件中)如果我的測試設置或app.config的設置效率低下,則可以改善此問題。

什麼我試過到目前爲止

// Defined in a tests-global.js file listed in my karma files array 
beforeEach(inject(function(_$httpBackend_){ 
    _$httpBackend_.whenGET(/\/api\/v1\/req_params.*/).respond([]); 
})); 

其失敗Error: Injector already created, can not register a module!因爲在我個人的測試套件我打電話beforeEach(module('x'));使用該模塊的模塊,並且你不能做一個inject(),經過。

我也試過

// Defined in a tests-global.js file listed in my karma files array 
beforeEach(function() { 
    var $injector = angular.injector(['ngMock']); 
    $httpBackend = $injector.get('$httpBackend'); 
    $httpBackend.whenGET(/\/api\/v1\/req_params.*/).respond([]); 
}); 

產生任何其他錯誤,但還沒有解決Unexpected request問題。

是否有任何方法來處理所有測試的期望,或者如果這是一個跡象表明我的測試結構設置的很糟糕,是否更好地構建我的代碼/測試?

回答

1

至於我,我不包括主要服務模塊,但它一個模擬的,像(對我來說,我包括這裏面karma.conf在「文件」):

angular.module('some.service', []).service('MainService', function() { 
    this.APP_HOST = 'localhost'; 
    this.APP_PORT = 8000; 
}); 

然後,在全球beforeEach測試中(記住MainService是一種嘲笑的,而不是真正的):

beforeEach(inject(function(_$httpBackend_, MainService, $rootScope, $controller) { 
    $httpBackend = _$httpBackend_; 
    MainService.APP_HOST = 'localhost'; 
    MainService.APP_PORT = '8000'; 
    baseUrl = '//' + MainService.APP_HOST + ':' + MainService.APP_PORT; 
    scope = $rootScope.$new(); 
    someCtrl = $controller('someCtrl', { 
     $scope: scope, 
     MainService: MainService 
    }); 
})); 

,並規定應該怎樣嘲笑:

function mockHttpSuccessfulRequest() { 
    $httpBackend 
     .expectGET(baseUrl + '/api/surveys') 
     .respond({ 
      surveys: [{ 
       something: false, 
       date: '2015-03-11T08:28:58.765Z' 
      }] 
     }); 
} 

,那麼你是一個測試訴訟前定義這個模擬:

beforeEach(mockHttpSuccessfulRequest);

而且你免費檢查你想要的一切。