Я работаю над приложением node
, которое связывается с сервисами мыла, используя модуль foam
для синтаксического анализа json в действительном запросе мыла и обратно при получении ответа. Все это прекрасно работает при общении с мыльными сервисами.Mocking soap services with nock
Проблема, с которой я столкнулась, заключается в написании модульных тестов для этого (интеграционные тесты работают нормально). Я использую 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-парсер будет не только принимать файл (который имеет смысл). Не доходит ли поток до его проверки?
Может ли XML-ответ быть посмеянным с нокаутом?
Я также поднял это на Github
Спасибо! Помог мне. – Fan