2014-02-10 37 views
9

我想在運行Protractor測試之前向數據庫服務器發出POST請求(使用JSON負載),以便注入測試數據。如果可能,我該如何做到這一點?如何從量角器測試中發出POST請求?

+1

見 http://stackoverflow.com/questions/21055960/bare-http-calls-from-protractor-tests/ 21057106#21057106 –

+0

@AndresD有沒有別的辦法?我不介意使用Node http模塊,但無法弄清楚如何從Jasmine測試中進行異步調用。 – aknuds1

回答

5

我發現了一個辦法做到這一點,與安德烈D的幫助,它的要點是通過browser.executeAsyncScript運行在瀏覽器的腳本,並在那裏注射$http service。 $ http服務然後被告知發出POST請求。下面是CoffeeScript如何完成的示例:

browser.get('http://your-angular-app.com') 
browser.executeAsyncScript((callback) -> 
    $http = angular.injector(["ng"]).get("$http") 
    $http(
    url: "http://yourservice.com" 
    method: "post" 
    data: yourData 
    dataType: "json" 
) 
    .success(-> 
    callback([true]) 
).error((data, status) -> 
    callback([false, data, status]) 
) 
) 
.then((data) -> 
    [success, response] = data 
    if success 
    console.log("Browser async finished without errors") 
    else 
    console.log("Browser async finished with errors", response) 
) 
+0

第3行的這個角度來自哪裏?我得到了未定義的角度。 – Ricbermo

+0

@Ricbermo我沒有在我面前的代碼,但它是[Angular的全局API]的一部分(https://docs.angularjs.org/api/ng#function)。 IIRC該函數在加載頁面的上下文中執行(例如'http:// your-angular-app.com'),它必須加載Angular。 – aknuds1

3

可以在量角器配置的onPrepare函數中運行一些異步設置代碼。您需要明確告訴量角器等待您的請求完成。這可以通過flow.await()來完成,這與promise有很好的結合。

onPrepare: function() { 

    flow = protractor.promise.controlFlow() 

    flow.await(setup_data({data: 'test'})).then(function(result) { 
    console.log(result); 
    }) 

} 

**作爲準備可以返回一個承諾量角器1.1.0的,所以使用的flow顯式地等待解決的承諾是不必要的。

請參見:https://github.com/angular/protractor/blob/master/CHANGELOG.md

+0

不熟悉onPrepare,但是整個套件會運行一次嗎?我真的需要每個測試設置/拆卸方法。 – aknuds1

+1

是的,它在運行任何測試之前運行一次。聽起來不像onPrepare會做你想做的事。 – rjferguson21

+0

flow.await似乎也在'it'或'beforeEach'函數中工作;我認爲'onPrepare'沒有限制。 –

4

如果您只想填充數據庫,則可以使用另一個庫運行POST請求。

例如,你可以在你beforeEach使用superagent像這樣:

var request = require("superagent"); 

describe("Something", function() { 

    beforeEach(function(done) { 
    request 
     .post("http://localhost/api/foo") 
     .send({data : "something"}) 
     .end(done); 
    }); 

});