如何在Ruby/Rails中测试发送到Web服务的XML
问题描述:
我正在寻找写入到外部Web服务的代码的单元测试的最佳方法。 POST请求的主体是一个XML文档,它描述了Web服务要执行的操作和数据。如何在Ruby/Rails中测试发送到Web服务的XML
现在,我已经将webservice包装在它自己的类中(类似于ActiveResource),并且我看不到任何方式来测试由该类生成的确切XML,而无需通过暴露某些内部XML来破坏封装生成作为公共方法的类。这似乎是一种代码异味 - 从类的用户的角度来看,他们不应该知道也不关心类是如何实际实现Web服务调用的,无论是XML,JSON还是信鸽。
对于类的例子:
class Resource
def new
#initialize the class
end
def save!
Http.post("http://webservice.com", self.to_xml)
end
private
def to_xml
# returns an XML representation of self
end
end
我希望能够测试产生,以确保它符合什么网络服务规格期待的XML。那么我可以最好的做到这一点,而不需要to_xml公共方法?
答
而不是调用一个私有方法,你可以发送邮件:
myobject.send(:method_name, args)
这应该避免访问私有方法的任何问题。也许更优雅,如果你使用RSPEC你可以这样做:
before(:each) do
MyClass.send(:public, *MyClass.protected_instance_methods)
end
,然后在你的测试就可以正常调用该方法。
答
检出Netrecorder(http://github.com/chrisyoung/netrecorder)或Fakeweb(http://github.com/chrisk/fakeweb)。
您可以使用send来调用Ruby 1.8中的私有方法,但不能使用1.9。这仍然是一个破解 - 我想测试接口(Ruby的一个,和Web服务之一),而不是它们的内部实现 - 如果我改变了如何在类中生成我的XML,我不应该改变我的测试。 – 2010-06-03 03:44:29