【问题标题】:How to test a Rails HTTP request to a Sinatra app?如何测试对 Sinatra 应用程序的 Rails HTTP 请求?
【发布时间】:2012-12-04 18:05:29
【问题描述】:

考虑一个 Rails 应用程序,它访问了一个与 Rails 应用程序分开开发的(Sinatra 应用程序)API。我想在 Rails 测试中测试 API 调用。

API 代码:

post '/foo/create' do
  ...

我创建了一个模拟,但这没有意义,因为它只是 API 文件的副本。太臭了。

可以在测试中要求 API 文件。但是如何从 RSpec 中调用它呢? Rails 应用程序中没有路由。

一种选择是启动 API 并从 Rails 测试中进行 HTTP 调用,但这很糟糕,因为:

  1. 您必须启动 API 服务器才能运行 Rails 测试
  2. 为什么 Rails 测试应该发出 HTTP 请求? Rack::Test 模拟了这一点。
  3. 我认为这不会起作用,因为这些应用程序具有不同的测试数据库,但共享相同的生产数据库。

编辑:测试的重点是 API 调用创建了 Rails 应用程序所期望的记录。所以 Rails 应用需要在 API 调用后测试数据库的状态。

【问题讨论】:

  • “创建模拟”是什么意思? webmock 是处理这类事情的绝佳工具,尤其是与 vcr 配对时。
  • “创建一个模拟”是指添加了在发出 HTTP 请求时 API 将运行的代码。

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


【解决方案1】:

嗯。对您来说,完美的答案是模拟webmock 之类的答案的宝石。它会在访问该 url 时伪造响应,因此在测试中,您的应用程序将按照真实情况发出请求,只是在它进入网络之前,它会点击您的模拟并以所需的答案进行响应。

【讨论】:

  • webmock 没有做我想做的事(因为我没有测试 HTTP 调用或响应)。但这给了我一个想法:我需要一种不同的 webmock。它接受 HTTP 请求,并在 Rails 测试数据库上运行 API 代码。我想知道是否有这方面的宝石,或者是否有一种简单的方法来做到这一点......
  • 所以你想要一个使用两个项目的集成测试?两个项目是否使用相同的数据库?
  • B 七,如果您不测试 HTTP 调用或响应,能否说明您要测试的内容?
  • 同意。这些是单独的应用程序,还是不是?你在测试什么,在哪里测试?
  • 我确实想要使用这两个项目进行集成测试。是的,两个项目在生产中使用相同的数据库,但不是在本地。我想在 API 调用后使用 Rails 应用程序测试来测试数据库的状态。它们是独立的应用程序。
猜你喜欢
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多