rspec has_xml失败,但错误消息显示元素的存在

时间:2013-08-22 17:37:39

标签: ruby-on-rails ruby xml xpath rspec

我遇到了一些麻烦 - 无法理解为什么我的rspec测试开始失败并且无法找到xml。它是使用this实现的。谁能帮我解决这个问题呢? Rspec测试:

response.status.should == 200
response.body.should have_xml('/PhoneBook/PhoneBookEntries/Contact/Id', @new_contact.id.to_s)

控制台输出:

   Failure/Error: response.body.should have_xml('/PhoneBook/PhoneBookEntries/Contact/Id', @new_contact.id.to_s)
       expected to find xml tag /PhoneBook/PhoneBookEntries/Contact/Id in:
       <PhoneBook>
         <APIVersion>1.0</APIVersion>
         <SyncTime>1377192796</SyncTime>
         <PhoneBookEntries>
           <Contact>
             <Id>182</Id>
             <Avatar>
               <type>PNG</type>
               <data>iVBORw0KGgoAAAANSUhEUgAAAKAAAACgAQAAAACjtFqAAAAABGdBTUEAALGP
       C/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUw
       AADqYAAAOpgAABdwnLpRPAAAAAJiS0dEAAHdihOkAAAACXBIWXMAAABIAAAA
       SABGyWs+AAAAIklEQVRIx+3IMQEAAAwCIPuX1gJrMDhJD5FSSimllFLKfznP
       BnQ17b9ZHAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMy0wOC0yMlQyMDozMzox
       NiswMzowMDdI2UsAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTMtMDgtMjJUMjA6
       MzM6MTYrMDM6MDBGFWH3AAAAAElFTkSuQmCC
       </data>
               <Modified>1377192796</Modified>
             </Avatar>
           </Contact>
           <Contact>
             <Id>183</Id>
             <Avatar>
               <type>PNG</type>
               <data>iVBORw0KGgoAAAANSUhEUgAAAKAAAACgAQAAAACjtFqAAAAABGdBTUEAALGP
       C/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUw
       AADqYAAAOpgAABdwnLpRPAAAAAJiS0dEAAHdihOkAAAACXBIWXMAAABIAAAA
       SABGyWs+AAAAIklEQVRIx+3IMQEAAAwCIPuX1gJrMDhJD5FSSimllFLKfznP
       BnQ17b9ZHAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMy0wOC0yMlQyMDozMzox
       NiswMzowMDdI2UsAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTMtMDgtMjJUMjA6
       MzM6MTYrMDM6MDBGFWH3AAAAAElFTkSuQmCC
       </data>
               <Modified>1345656796</Modified>
             </Avatar>
           </Contact>
         </PhoneBookEntries>
       </PhoneBook>

1 个答案:

答案 0 :(得分:1)

您链接代码的匹配器无法处理具有不同文本值的两个匹配节点。或者,更准确地说,如果您为其指定一个选择两个或更多具有不同文本的节点的xpath,它将始终无法匹配。

您的XML有两个匹配的xpath /PhoneBook/PhoneBookEntries/Contact/Id节点,这些匹配的文本都不包含相同的字符串ID。这就是你失败的原因。

在没有修复匹配器的情况下,最简单的做法是在xpath中只选择一个匹配的节点,并在不提供第二个文本参数时依赖行为

response.body.should have_xml( 
   "/PhoneBook/PhoneBookEntries/Contact[Id='#{@new_contact.id}']" )

这会将匹配ID移动到xpath查询本身,因此获取匹配节点意味着您已经添加了要声明的ID。 xpath选择匹配的Contact节点,而不是Id节点,这可能对于进一步的断言有用。