2016-06-28 8 views
1

私はいくつかのテストでChai-HTTPを利用しようとしています。当然私は私のGET以上のテストをしたいと思いますが、私はPOSTをしようとするときに大きな障害物に当たっているようです。Chai-HTTPを使って投稿するときに間違ったコンテンツタイプがあると思われる

私のPOSTがうまくいかなかった理由を理解するために、私はPOSTテストサーバーに対してそれらのヒットを開始しました。

frisby.create('LOGIN') 
    .post('http://posttestserver.com/post.php', { 
    grant_type:'password', 
    username:'[email protected]', 
    password:'password' 
    }) 
    .addHeader("Token", "text/plain") 
    .expectStatus(200) 
    }) 
.toss(); 

になり:

Time: Mon, 27 Jun 16 13:40:54 -0700 
Source ip: 204.191.154.66 

Headers (Some may be inserted by server) 
REQUEST_URI = /post.php 
QUERY_STRING = 
REQUEST_METHOD = POST 
GATEWAY_INTERFACE = CGI/1.1 
REMOTE_PORT = 19216 
REMOTE_ADDR = 204.191.154.66 
HTTP_CONNECTION = close 
CONTENT_LENGTH = 64 
HTTP_HOST = posttestserver.com 
HTTP_TOKEN = text/plain 
CONTENT_TYPE = application/x-www-form-urlencoded 
UNIQUE_ID = V3GPVkBaMGUAAB1Uf04AAAAc 
REQUEST_TIME_FLOAT = 1467060054.9575 
REQUEST_TIME = 1467060054 

Post Params: 
key: 'grant_type' value: 'password' 
key: 'username' value: '[email protected]' 
key: 'password' value: 'password' 
Empty post body. 

Upload contains PUT data: 
grant_type=password&username=hello%40world.com&password=password 

そして、ここで

は(だけで正常に動作)テストのための完全に異なるツールチェーン(ジャスミン・ノードとFrisby)を使用してフォーマットされたPOSTの試みでありますChaiとChai-HTTPを使ったPOSTの試みがあります。私はJasmineとFrisbyを使って上記の例と同じように動作すると期待していますが、実際の要求はいくつかの点で異なります。その結果

describe('/post.php', function() { 

    var endPointUnderTest = '/post.php'; 

    it('should return an auth token', function(done) { 
    chai.request('http://posttestserver.com') 
     .post(endPointUnderTest) 
     .set('Token', 'text/plain') 
     .send({ 
     grant_type: 'password', 
     username: '[email protected]', 
     password: 'password' 
     }) 
     .end(function(err, res) { 
     console.log(res); 
     res.should.have.status(200); 
     done(); 
     }); 
    }); 
}); 

Time: Tue, 28 Jun 16 06:55:50 -0700 
Source ip: 204.191.154.66 

Headers (Some may be inserted by server) 
REQUEST_URI = /post.php 
QUERY_STRING = 
REQUEST_METHOD = POST 
GATEWAY_INTERFACE = CGI/1.1 
REMOTE_PORT = 1409 
REMOTE_ADDR = 204.191.154.66 
HTTP_CONNECTION = close 
CONTENT_LENGTH = 76 
CONTENT_TYPE = application/json 
HTTP_TOKEN = text/plain 
HTTP_USER_AGENT = node-superagent/2.0.0 
HTTP_ACCEPT_ENCODING = gzip, deflate 
HTTP_HOST = posttestserver.com 
UNIQUE_ID = V3KB5kBaMGUAAErPF6IAAAAF 
REQUEST_TIME_FLOAT = 1467122150.9125 
REQUEST_TIME = 1467122150 

No Post Params. 

== Begin post body == 
{"grant_type":"password","username":"[email protected]","password":"password"} 
== End post body == 

Upload contains PUT data: 
{"grant_type":"password","username":"[email protected]","password":"password"} 

お知らせCONTENT_TYPE、ポストのparamsの違い、特にデータをPUTが(私はこれが私の問題の原因だと思います)。

Jasmine/Frisbyが 'application/x-www-form-urlencoded'形式でPOSTを送信する場合、Chai-HTTPは 'application/json'形式を使用しているようです。

私は何とかChai-HTTPのPOST機能を悪用していますか?あるいは、Chai-HTTPは 'application/x-www-form-urlencoded' POSTリクエストを許可していませんか?私はこれを解決することができないようで、私のテストではMocha/Chaiツールチェーンを使用するように移行するのが最終的なハードルです(目標ではない限り、別のライブラリを使用しない方がいいですそれは絶対に必要です)。

答えて

5

これをChai-HTTPのGit-Hubページでさらに説明しましたが、これはChai-HTTPのフードの下にあるHTTPリクエストライブラリSuperAgentの期待された動作であることがわかりました。 .send()呼び出しに含まれるデータの種類に基づいてタイプします。

私はthis particular questionを見つけたので、実際にはコンテンツタイプの違いを明確にするのに役立ちました。

誰がこの問題に遭遇した場合、私はチャイ-HTTPのPOSTリクエストは、このような呼び出し使用(名声がhereを助けるのをmeeberするために)非常に簡単に変更することができることを学びました:その要求を作成

//Override auto-detection by specifying the header explicitly 
.set('content-type', 'application/x-www-form-urlencoded') 

//Select the type 'form' 
.type('form') 

//Pass multiple strings in send instead of using an object 
.send('grant_type=password') 
.send('[email protected]') 
.send('password=password') 

を次のようになります。

describe('/post.php', function() { 

    var endPointUnderTest = '/post.php'; 

    it('should return an auth token', function(done) { 
    chai.request('http://posttestserver.com') 
     .post(endPointUnderTest) 
     .set('Token', 'text/plain') 
     .set('content-type', 'application/x-www-form-urlencoded') 
     .type('form') 
     .send('grant_type=password') 
     .send('[email protected]') 
     .send('password=password') 
     .end(function(err, res) { 
     console.log(res); 
     res.should.have.status(200); 
     done(); 
     }); 
    }); 
}); 
関連する問題