【问题标题】:Testing an external API using RSpec's request specs使用 RSpec 的请求规范测试外部 API
【发布时间】:2013-08-21 17:34:44
【问题描述】:

我正在尝试使用 RSpec 的请求规范将主机更改为指向远程 URL 而不是 localhost:3000。请让我知道这是否可行。

注意:只是想提一下远程 URL 只是一个 JSON API。

【问题讨论】:

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


【解决方案1】:

是的,有可能

基本上

require 'net/http'
Net::HTTP.get(URI.parse('http://www.google.com'))
# => Google homepage html

但您可能需要模拟响应,因为测试最好不要依赖外部资源。

然后您可以使用 Fakeweb 或类似的 mock gem:https://github.com/chrisk/fakeweb

require 'net/http'
require 'fakeweb'
FakeWeb.register_uri(:get, "http://www.google.com", :body => "Hello World!")

describe "external site" do
  it "returns 'World' by visiting Google" do
    result = Net::HTTP.get(URI.parse('http://www.google.com'))
    result.should match("World")
    #=> true
  end
end

获得正常的 html 响应或 jsonp 响应都没有关系。都差不多。

以上是低级方式。更好的方法是在应用程序中使用您的代码来检查它。但你最终总是需要模拟。

【讨论】:

  • 嘿,比利,有没有办法将默认主机设置为“www.google.com”,这样我的所有请求规范(如 /users)都会针对该主机运行?
  • @MadhanPadmanabhan,这应该是你想要的。您可以将 google.com 设置为变量并单独设置查询字符串。在这里查看:ruby-doc.org/stdlib-2.0/libdoc/net/http/rdoc/Net/…
  • 嗯,即使我需要它,我也会得到未初始化的常量 Net::Http :/
  • 谢谢!我可以将 URI 设置为配置文件中的变量,以便每当我执行 get /users.json 时,URL 都会被预先设置?
  • 您可以在 spec_helper.rb 中设置它,这是您在测试中始终需要的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多