我正在處理與肥皂服務通信的node
應用程序,使用foam
模塊將json解析爲有效的肥皂請求,並在接收到響應時再返回。當與soap服務進行通信時,這一切都可以正常工作。nock嘲笑肥皂服務
我遇到的問題是爲此編寫單元測試(集成測試工作正常)。我使用nock
來模擬http服務併發送回復。這個回覆沒有得到解析foam
,然後我可以對響應做出斷言。
所以我不能傳遞一個json對象作爲回覆,因爲foam
需要soap響應。如果我試圖做到這一點我得到錯誤:
Error: Start tag expected, '<' not found
在JavaScript中的變量存儲XML是痛苦的,不工作(即其包裝在引號和轉義內部引號是無效的),所以我想將嘲諷的XML響應放入一個文件並將其作爲回覆傳遞。
我試圖讀取該文件作爲一個流
return fs.createReadStream('response.xml')
...並以文件
.replyWithFile(201, __dirname + 'response.xml');
兩個失敗的錯誤回答
TypeError: Cannot read property 'ObjectReference' of undefined
這裏是文件中的XML
<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
<env:Header></env:Header>
<env:Body>
<FLNewIndividualID xmlns='http://www.lagan.com/wsdl/FLTypes'>
<ObjectType>1</ObjectType>
<ObjectReference>12345678</ObjectReference>
<ObjectReference xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:nil='true'/>
<ObjectReference xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:nil='true'/>
</FLNewIndividualID>
</env:Body>
</env:Envelope>
被測試的模塊
var foam = require('./foam-promise.js');
module.exports = {
createUserRequest: function(url, operation, action, message, namespace) {
var actionOp = action + '/actionRequestOp',
uri = url + '/actionRequest';
return new Promise(function(resolve, reject) {
foam.soapRequest(uri, operation, actionOp, message, namespace)
.then(function(response) {
resolve(response.FLNewIndividualID.ObjectReference[0]);
})
.catch(function(err) {
reject(err);
});
});
}
};
斷言使用should-promised
return myRequest(url, operation, action, data, namespace)
.should.finally.be.exactly('12345678');
所以它看起來像XML解析器將不只是接受一個文件(這是有道理的)。流在測試之前未完成嗎?
使用nock可以成功模擬XML回覆嗎?
我也提出了這對Github
謝謝!幫助過我。 – Fan