2016-08-11 60 views
0

我試圖用frisby.js測試一些API。我遇到了麻煩,通過.post()方法發送一個xml塊。我可以在郵差裏做到這一點。frisby.js .post() - 在正文中發送xml的問題

這裏是我的代碼:

var xml_body = envSetup.ENV_DATA.inrule.xml_post_kia1; 

frisby.create('InRule 02 Verify XML Post') 
    .addHeaders({ 
    'Accept': 'application/xml', 
    'Authorization': 'Basic <some internal token>', 
    'Content-Length': xml_body.length, 
    'Content-Type': 'application/xml' 
    }) 
    .post(envSetup.URL + '/' + resource + '?action=basic', xml_body) 
    .inspectRequest() 

    .inspectBody() 
    .expectStatus(200) 
    .expectHeaderContains('Content-Type', 'application/xml') 

.toss(); // InRule 02 

這裏是輸出:

$ jasmine-node --color --verbose --config ENV inrule spec/inrule_spec.js 
{ json: false, 
    uri: 'http://dev.<company_api>/api/rules?action=basic', 
    body: null, 
    method: 'POST', 
    headers: 
    { accept: 'application/xml', 
    authorization: 'Basic <some internal token>', 
    'content-length': '787', 
    'content-type': 'application/xml' }, 
    inspectOnFailure: false, 
    baseUri: '', 
    timeout: 5000 } 
<RuleResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://<company_api>/resources/rules"><EntityData i:nil="true" /><Error>Unhandled Exception: Rules controller caught Exception: Object reference not set to an instance of an object.</Error><LogDetailLocation i:nil="true" /><ResponseText>Error Occurred</ResponseText><RuleApplication i:nil="true" /><Status>5</Status><StatusDescription i:nil="true" /></RuleResponse> 

Frisby Test: InRule 01 Verify Get - 253 ms 

     [ GET http://dev.<company_api>/api/rules?action=basic ] - 253 ms 

Frisby Test: InRule 02 Verify Schema (Post) - 24 ms 

     [ POST http://dev.<company_api>/api/rules?action=basic ] - 23 ms 

Failures: 

    1) Frisby Test: InRule 02 Verify Schema (Post) 
     [ POST http://dev.<company_api>/api/rules?action=basic ] 
    Message: 
    Expected 500 to equal 200. 
    Stacktrace: 
    Error: Expected 500 to equal 200. 
    at null.<anonymous> (H:\frisby\esb\node_modules\frisby\lib\frisby.js:493:42) 
    at null.<anonymous> (H:\frisby\esb\node_modules\frisby\lib\frisby.js:1074:43) 
    at Timer.listOnTimeout (timers.js:92:15) 

Finished in 0.278 seconds 
2 tests, 5 assertions, 1 failure, 0 skipped 

我已經試過/不帶 '內容長度'

我已經試過「 Content-Type':'application/xml'和'Content-Type':'application/xml; charset = UTF-8'

我覺得這個問題在於一個事實,即.inspectRequest()是顯示

body: null,

當我看到成功的郵差「生成代碼」爲要求的NodeJS它顯示了一個體:

var options = { method: 'POST', 
    url: 'http://dev.rules.itagroupservices.int/api/rules', 
    qs: { action: 'basic' }, 
    headers: 
    { 'postman-token': '69bf39bc-3a6e-f1ea-7d8c-319ebbd41eef', 
    'cache-control': 'no-cache', 
    accept: 'application/xml', 
    authorization: 'Basic <some internal token>', 
    'content-type': 'application/xml' }, 
    body: '<RuleRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance"\r\n\t\txmlns="http://<company_api>/resources/rules">\r\n \r\n <EntityData>\r\n<![CDATA[bunch of xml data]]>\r\n \r\n </EntityData>\r\n</RuleRequest>' }; 

我不知道爲什麼frisby沒有顯示身體(因此不會發送一個?),即使我將xml_body放在了應該去的地方。

回答

0

以下是官方回答:爲了發送XML,您必須將您的請求主體作爲標題的一部分發送。

frisby.create('Post XML to api') 
    .post(someUrl, {}, { 
    headers: headers4, 
    body: xml1 
    } 
) 
    //.inspectRequest() 

    //.inspectBody() 
    .expectHeaderContains('Content-Type', 'application/xml') 
    .expectStatus(200) 
.toss(); 

你可以看到我在.post(url, body, header)格式離開了身體部分空與{}。然後在第三個變量.post的你給它一個body: xmlVariable

另一個這裏例如:https://github.com/vlucas/frisby/issues/290

0

雖然沒有直接回答我的問題,如果別人有同樣的問題...你可以讓你的頭腦出frisby和退一步,使用jasmine-node而是 - 你的弗里斯比_spec.js文件中! Node.js有一個request包,可以讓你發佈任何內容,所以你可以執行Jasmine describe/it。

describe('Stuff', function() { 

    it('DoIt', function(done) { 
    var options = { 
     method: 'POST', 
     url: envSetup.URL + '/' + resource, 
     qs: { action: 'basic' }, 
     headers: 
     { accept: 'application/xml', 
     authorization: yourAuthorization, 
     'content-type': 'application/xml' }, 
     body: xml_variable 
    }; 

    request(options, function (error, response, body) { 
     if (error) throw new Error(error); 
     //console.log(body); 
     expect(response.statusCode).toBe(200); 
     done(); 
    }); 
    }); 
}); 

這將成功發佈的XML API和獲得效應初探回來的body形式。我寧願能夠在frisby.js中做到這一點,所以我仍然接受人們的解決方案。