我正在开发一个node
与soap服务通信的应用程序,使用foam
模块将json解析为有效的soap请求,并在收到响应时再次返回。在与肥皂服务通信时,这一切都很好。
我遇到的问题是为此编写单元测试(集成测试工作正常)。我nock
用来模拟 http 服务并发送回复。这个回复确实会被解析foam
,然后我可以对回复做出断言。
所以我不能传递一个 json 对象作为回复,因为foam
需要一个肥皂响应。如果我尝试这样做,我会收到错误:
Error: Start tag expected, '<' not found
将 XML 存储在 javascript 变量中是痛苦的并且不起作用(即用引号括起来并转义内部引号是无效的),所以我想将模拟的 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上提出了这个