Ruby on rails 如何在Ruby/Rails中测试发送到web服务的XML
我正在寻找为发布到外部web服务的代码编写单元测试的最佳方法。POST请求的主体是一个XML文档,它描述了web服务要执行的操作和数据 现在,我已经将webservice包装在它自己的类中(类似于ActiveResource),我无法找到任何方法来测试类生成的确切XML,而不破坏封装,将一些内部XML生成公开为类上的公共方法。这似乎是一种代码味道——从类用户的角度来看,他们不应该知道,也不应该关心类如何实际实现web服务调用,无论是使用XML、JSON还是信鸽 有关该类的示例:Ruby on rails 如何在Ruby/Rails中测试发送到web服务的XML,ruby-on-rails,ruby,unit-testing,Ruby On Rails,Ruby,Unit Testing,我正在寻找为发布到外部web服务的代码编写单元测试的最佳方法。POST请求的主体是一个XML文档,它描述了web服务要执行的操作和数据 现在,我已经将webservice包装在它自己的类中(类似于ActiveResource),我无法找到任何方法来测试类生成的确切XML,而不破坏封装,将一些内部XML生成公开为类上的公共方法。这似乎是一种代码味道——从类用户的角度来看,他们不应该知道,也不应该关心类如何实际实现web服务调用,无论是使用XML、JSON还是信鸽 有关该类的示例: class Re
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,以确保它符合web服务规范的要求。因此,我能最好地做到这一点,而不必将xml设为公共方法吗?您可以发送消息,而不是调用私有方法:
myobject.send(:method_name, args)
这样可以避免访问私有方法时出现任何问题。如果您使用rSpec,您可以做到以下几点:
before(:each) do
MyClass.send(:public, *MyClass.protected_instance_methods)
end
然后在测试中,您可以正常调用该方法。请查看Netrecorder()或Fakeweb()。您可以在Ruby 1.8中使用send调用私有方法,但不能在Ruby 1.9中使用。尽管如此,这仍然是一种黑客行为——我想测试接口(Ruby接口和web服务接口),而不是它们的内部实现——如果我改变在类中生成XML的方式,我就不必改变我的测试。