2010-06-03 49 views
0

我正在寻找写入到外部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公共方法?

回答

1

而不是调用一个私有方法,你可以发送邮件:

myobject.send(:method_name, args) 

这应该避免访问私有方法的任何问题。也许更优雅,如果你使用RSPEC你可以这样做:

before(:each) do 
    MyClass.send(:public, *MyClass.protected_instance_methods) 
end 

,然后在你的测试就可以正常调用该方法。

+0

您可以使用send来调用Ruby 1.8中的私有方法,但不能使用1.9。这仍然是一个破解 - 我想测试接口(Ruby的一个,和Web服务之一),而不是它们的内部实现 - 如果我改变了如何在类中生成我的XML,我不应该改变我的测试。 – 2010-06-03 03:44:29