2012-01-09 2 views
3

При попытке издеваться на Faraday::Response объект, я пытался:Дразнящий `body` объект Фарадей :: Response, и Nokogiri :: XML :: NodeSet

mock(Faraday::Response, :env => {:body => "...some xml..."}) 

... но это не помогает, когда я вызовите response.body.xpath(...), потому что тело - это String, и он ожидает NodeSet.

Есть ли простой способ преобразования произвольной строки XML в NodeSet? Я прочитал документы Nokogiri::XML::NodeSet, но это либо не существует, либо я пропустил его.

Вот моя фактическая заглушка + издеваться:

@conn.stub!(:get).and_return(mock Faraday::Response, 
     :env => {:status=>207}, 
     :body => '<scheduled-calendar xmlns="[removed]" xmlns:xsi="[removed]" id="95ec6d99-2c4a-4e25-99a1-2e988c0dbce6" assignment-id="uuid_for_test" xsi:schemaLocation="[removed]" debug="true"> 
       <scheduled-study-segment id="4e5b24e3-b50a-45e2-aec1-cb6c839a20f1" start-date="2012-01-06" start-day="1" study-segment-id="524910e9-634a-4791-a0b2-90f506a86474"> 
       <scheduled-activity id="1caa08b2-acb0-4c93-8c76-6460f0e9ee09" ideal-date="2012-01-06" details="Screening survey" repetition-number="0" planned-activity-id="1fc520dd-5b6f-4125-b83c-2f8801ea3065"> 
       <current-scheduled-activity-state reason="Initialized from template" date="2012-01-06" state="conditional"/> 
       </scheduled-activity> 
       </scheduled-study-segment> 
       </scheduled-calendar>' 
    ) 

Вот вызов xpath

response.body.xpath('//psc:scheduled-activity', Psc.xml_namespace).collect{|activity| activity.attributes["id"].value} 

А вот Неудачный тест:

NoMethodError in 'PscV1 should allow you to get a list of scheduled activity ids for a given involvement' 
undefined method `xpath' for #<String:0x10dad1818> 
+0

«Эй, ответ! Ты больше похож на просьбу ко мне!» ;) – TrueWill

+0

Кроме того, если я удаляю макет и действительно ли он попадает в API вживую, я возвращаю объект «Faraday :: Response», поэтому я издеваюсь над этим объектом. Я что-то не хватает там? – jefflunt

ответ

1

Таким образом, по существу, ответ оказался, что Фарадей не обрабатывал мое тело, как XML, и как результат, только что прошел ответ обратно в виде строки, вместо Nokogiri::XML::Document

Поступая ...

xml = Nokogiri::XML('<scheduled-calendar xmlns="[removed]" xmlns:xsi="[removed]" id="95ec6d99-2c4a-4e25-99a1-2e988c0dbce6" assignment-id="uuid_for_test" xsi:schemaLocation="[removed]" debug="true"> 
      <scheduled-study-segment id="4e5b24e3-b50a-45e2-aec1-cb6c839a20f1" start-date="2012-01-06" start-day="1" study-segment-id="524910e9-634a-4791-a0b2-90f506a86474"> 
      <scheduled-activity id="1caa08b2-acb0-4c93-8c76-6460f0e9ee09" ideal-date="2012-01-06" details="Screening survey" repetition-number="0" planned-activity-id="1fc520dd-5b6f-4125-b83c-2f8801ea3065"> 
      <current-scheduled-activity-state reason="Initialized from template" date="2012-01-06" state="conditional"/> 
      </scheduled-activity> 
      </scheduled-study-segment> 
      </scheduled-calendar>') 

а потом мимоходом, что xml переменной в качестве тела ...

@conn.stub!(:get).and_return(mock Faraday::Response, 
    :env => {:status=>207}, 
    :body => xml 
) 

... вопрос был решен.

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