2014-02-10 2 views
9

테스트 데이터를 삽입하기 위해 Protractor 테스트를 실행하기 전에 데이터베이스 서버에 POST 요청 (JSON 페이로드 포함)을 만들고 싶습니다. 어떻게하면 가능합니까?각도기 테스트에서 어떻게 POST 요청을 할 수 있습니까?

+1

이 http://stackoverflow.com/questions/21055960/bare-http-calls-from-protractor-tests/를 참조하십시오 21057106 # 21057106 –

+0

@AndresD 다른 방법이 있습니까? 노드 http 모듈을 사용해도 상관 없지만 Jasmine 테스트에서 비동기 호출을 수행하는 방법을 알아낼 수는 없습니다. – aknuds1

답변

5

나는 그것의 요점은 browser.executeAsyncScript를 통해 브라우저에서 스크립트를 실행하고 거기에 $http service을 주입하는 것입니다 안드레스 D.의 도움으로 그것을 할 수있는 방법을 발견했다. $ http 서비스는 POST 요청을하게됩니다. 다음 예는 어떻게하는지의 커피 스크립트 : 당신은 당신의 데이터베이스를 채우는하려는 경우 그냥 POST 요청을 실행하는 다른 라이브러리를 사용할 수 있습니다

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')의 컨텍스트 내에서 실행되며 각도가로드되어 있어야합니다. – aknuds1

3

각도기 구성의 onPrepare 기능에서 일부 비동기 설정 코드를 실행할 수 있습니다. 각도기에게 요청이 끝날 때까지 기다리라고 명시 적으로 지시해야합니다. 이것은 flow.await()로 할 수 있습니다.

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

.

예를 들어, 당신은 다음처럼 beforeEachsuperagent를 사용할 수 있습니다

var request = require("superagent"); 

describe("Something", function() { 

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

}); 
관련 문제