【问题标题】:Mocking a Faraday::Response object's `body`, and Nokogiri::XML::NodeSet模拟 Faraday::Response 对象的 `body` 和 Nokogiri::XML::NodeSet
【发布时间】:2012-01-09 17:21:12
【问题描述】:

在尝试模拟 Faraday::Response 对象时,我尝试过:

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

...但是当我调用response.body.xpath(...) 时失败了,因为主体是一个字符串,它需要一个 NodeSet。

有没有一种简单的方法可以将任意 XML 字符串转换为 NodeSet?我已经阅读了 Nokogiri::XML::NodeSet 文档,但它要么不存在,要么我错过了。

这是我实际的 stub+mock:

@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>

【问题讨论】:

  • “嘿!回应!你看起来更像是我的请求!” ;)
  • 除了,如果我删除了 mock 并让它真正实时地访问 API,我会返回一个 Faraday::Response 对象,这就是我模拟该对象的原因。我错过了什么重要的东西吗?

标签: unit-testing xml-parsing nokogiri faraday


【解决方案1】:

所以,基本上答案是 Faraday 没有将我的身体视为 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
)

...问题已解决。

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 2021-01-20
    • 1970-01-01
    • 2017-10-30
    • 2019-06-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多