2015-06-05 221 views
1

我正在處理與肥皂服務通信的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

回答

4

繼pgte的意見在這裏https://github.com/pgte/nock/issues/326我能夠通過設置正確的頭,用XML字符串(包含轉義引號)回覆得到這個工作。

從pgte:

這裏的工作測試的外觀:

it('should return a user ID', function(){ 
    var response = '<env:Envelope xmlns:env=\'http://schemas.xmlsoap.org/soap/envelope/\'><env:Header></env:Header><env:Body><UserReference>12345678</UserReference></env:Body></env:Envelope>' 

    nock(url) 
     .post('/createUserRequest') 
     .reply(201, response, { 
       'Content-Type': 'application/xml' 
       } 
     ); 

    return createUserRequest(url, operation, action, message, options) 
     .should.be.fulfilledWith('12345678'); 
}); 

it('should be rejected if the request fails', function() { 

    nock(url) 
     .post('/createCaseRequest') 
     .replyWithError('The request failed'); 

    return createUserRequest(url, operation, action, message, options) 
     .should.be.rejected; 
}); 
+1

謝謝!幫助過我。 – Fan