2012-12-20 83 views
4

根據vojitajina pull request,我和老闆之間關於Angular E2E testing.的熱烈討論,我們需要運行一個服務器來運行e2e測試。因此,運行e2e測試需要一臺真正的服務器,一臺真正的服務器需要數據庫。這使得測試變得緩慢。現在,問題是如何在不涉及真正的服務器的情況下測試e2e?有沒有辦法使用httpBackend和e2e角度API,我可以使用browser(),element(),select(),爲我的測試?模擬httpBackend的角度端到端測試?

回答

5

[見下面的編輯]我們使用shell腳本定期捕獲來自種子測試服務器的curl請求。然後這些響應通過$ httpBackend.whenGet(...).response()返回以截獲並返回該數據。

因此,在我們的index.html

if (document.location.hash === '#test') { 
    addScript('/test/lib/angular-mocks.js'); 
    addScript('/test/e2e/ourTest.js'); 
    window.fixtures = {}; 
    addScript('/test/fixtures/tasks/tasks_p1.js'); 
    // the tasks_p1.js is generated and has "window.fixtures.tasks_p1 = ...json..." 
    addScript('/test/fixtures/tasks/tasks_p2.js'); 
    // the tasks_p2.js is generated and has "window.fixtures.tasks_p2 = ...json..." 
    addScript('/test/e2e/tasks/taskMocks.js\'><\/script>'); 
} 

ourTest.js

angular.module('ourTestApp', ['ngMockE2E','taskMocks']). 
    run(function ($httpBackend, taskMocks) { 
     $httpBackend.whenGET(/views\/.*/).passThrough(); 
     $httpBackend.whenGET(/\/fixtures.*\//).passThrough(); 

     taskMocks.register(); 

     $httpBackend.whenGET(/.*/).passThrough(); 
    }); 

taskMocks.js

/*global angular */ 
angular.module('taskMocks', ['ngMockE2E']). 
    factory('taskMocks', ['$httpBackend', function($httpBackend) { 
    'use strict'; 
    return { 
    register: function() { 
     $httpBackend.whenGET(..regex_for_url_for_page1..).respond(window.fixtures.tasks_p1); 
     $httpBackend.whenGET(..regex_for_url_for_page2..).respond(window.fixtures.tasks_p2); 
    } 
    }; 
}]); 

在少數情況下我們的數據是關係到當前的日期;例如「本週的任務」,所以我們按照register()方法處理捕獲的數據。

編輯 我們現在使用Rosie爲我們的模擬對象創建工廠。因此,沒有更多的CURLing測試服務器用於預期的json響應。 index.html的不再加載這些「.js文件」燈具和嘲笑的樣子:

taskMocks.js

/*global angular */ 
angular.module('taskMocks', ['ngMockE2E']). 
    factory('taskMocks', ['$httpBackend', function($httpBackend) { 
    'use strict'; 
    var tasks_p1 = [ Factory.build('task'), Factory.build('task')], 
     tasks_p2 = [ Factory.build('task'), Factory.build('task')] 
    return { 
    register: function() { 
     $httpBackend.whenGET(..regex_for_url_for_page1..).respond(tasks_p1); 
     $httpBackend.whenGET(..regex_for_url_for_page2..).respond(tasks_p2); 
    } 
    }; 
}]); 
+0

很抱歉,但我不明白什麼。 – Adelin

+0

什麼是「捲曲請求」,以及種子測試服務器的含義是什麼? – Adelin

+0

對不起 - 試圖讓你足夠讓你過駝峯。 curl是用於製作網絡請求的命令行工具。 –

-1

要回答你的問題,是有一種方法可以做到這一點,而不涉及真正的服務器您可以使用$ httpBackend在e2e測試中模擬響應,但並不像在單元測試中嘲諷它們那樣簡單。您還需要在index.html中包含angular-mocks.js,並在app.js中包含'ngMockE2E'。

How to mock an AJAX request?

+0

如果您打算投降,請評論原因。問題是「如何在不涉及真正的服務器的情況下測試e2e?有沒有一種方法可以使用httpBackend和e2e角度API,我可以在我的測試中使用browser(),element(),select()?」我相信我已經回答了! – EdL

+0

這就是我的做法,它的工作原理 - 從我這裏得到讚揚 – DavidC