Имитация «тела» объекта Faraday::Response и Nokogiri::XML::NodeSet

При попытке издеваться над объектом Faraday::Response я пробовал:

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

... но это не удается, когда я вызываю response.body.xpath(...), потому что тело представляет собой строку и ожидает 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>

person jefflunt    schedule 09.01.2012    source источник
comment
Привет! Ответ! Вы больше похожи на просьбу ко мне! ;)   -  person TrueWill    schedule 09.01.2012
comment
За исключением того, что если я удалю макет и он действительно попадет в API в реальном времени, я верну объект Faraday::Response, поэтому я издеваюсь над этим объектом. Я пропустил что-то важное там?   -  person jefflunt    schedule 09.01.2012


Ответы (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
)

... проблема была решена.

person jefflunt    schedule 09.01.2012