Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Ruby/Rails中测试发送到web服务的XML_Ruby On Rails_Ruby_Unit Testing - Fatal编程技术网

Ruby on rails 如何在Ruby/Rails中测试发送到web服务的XML

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

我正在寻找为发布到外部web服务的代码编写单元测试的最佳方法。POST请求的主体是一个XML文档,它描述了web服务要执行的操作和数据

现在,我已经将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,以确保它符合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的方式,我就不必改变我的测试。