テストデータを挿入するために、 分度器 テストを実行する前に、データベースサーバーにPOSTリクエスト(JSONペイロードを使用)を送信したいと思います。どうすればよいですか?可能であれば、これを行いますか?
Andres 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)
)
データベースにデータを入力するだけの場合は、別のライブラリを使用してPOSTリクエストを実行できます。
たとえば、次のようにbeforeEach
で superagent を使用できます。
var request = require( "superagent" );
describe( "Something", function() {
beforeEach( function( done ) {
request
.post( "http://localhost/api/foo" )
.send( {data : "something"} )
.end( done );
} );
} );
分度器構成のonPrepare関数で非同期セットアップコードを実行することができます。リクエストが終了するのを待つように分度器に明示的に指示する必要があります。これは、promiseでNiceを再生するflow.await()を使用して実行できます。
onPrepare: function() {
flow = protractor.promise.controlFlow()
flow.await(setup_data({data: 'test'})).then( function(result) {
console.log(result);
})
}
**分度器1.1.0以降、prepareでpromiseを返すことができるため、flow
を使用してpromiseの解決を明示的に待機する必要はありません。
参照: https://github.com/angular/protractor/blob/master/CHANGELOG.md
POST分度器からのリクエストを行う別の方法は、「http」を使用することです
import http = require('http');
const data = yourData;
const options = {
port: portnumber,
hostname: hostname, // without http
path: '/api/path/',
method: 'POST'
headers: {
"content-type": "application/json"
}
};
const request = http.request(options, function (result) {
var body = '';
result.on("data", function (chunk) {
body = body + chunk;
});
result.on("end", function () {
console.log(body);
});
});
request.write(JSON.stringify(data));
request.end();