2015-06-05 11 views
1

Я работаю над приложением 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

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^