【问题标题】:Rspec testing against data from an external database针对来自外部数据库的数据进行 Rspec 测试
【发布时间】:2012-01-04 23:03:33
【问题描述】:

我目前正在为 Rails 2.3 应用程序创建 rspec 测试用例。我面临的问题是应用程序依赖于来自外部数据库的数据,如下所示:

  • Main_User 是一个外部应用程序。

  • Node_User 是我正在测试的应用程序。

当创建一个新的 Node_User 时,Node_User 调用 Main_User 创建一个用户并返回一些 Node_User 用来创建 Node_User 的数据。

有什么方法可以查询 Main_User 数据库来验证那里创建的记录是否包含传递给 Node_User 的数据?或者有更好的测试方法吗?

谢谢!

【问题讨论】:

  • 你在写单元测试还是集成测试?
  • 我想这将是更多的集成测试。对 Main_User 应用程序的调用在 Node_User 模型中作为 Net::HTTP 调用完成。我们向 Main_User 发送一些参数。然后它创建一条 Main_User 记录并将 Node_User 的信息发回。然后稍微按摩一下数据,最后创建 Node_User 记录。我想确保我们得到的结果是 Main_User 正在从发送到 Main_User 的参数中创建。

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


【解决方案1】:

是的,如果您有权访问该数据库的用户/密码/主机名,理论上您可以查询远程数据库。 (搜索“Rails 多个数据库”。)

但我不一定建议采用这种方法。您的测试将修改远程数据库的状态。这让我觉得不安全。如果您的测试执行任何大规模删除或使用损坏的功能,您将创建虚假记录,并可能删除或损坏数据。换句话说,您的测试可能会对生产数据库造成不良影响。

因此,我建议以某种方式模拟远程数据库。一种选择是VCR。这真的很酷,但它需要您至少对远程数据库进行一次操作,因为它必须记录第一次运行。另一种选择是使用 VCR 底层工具之一,例如 FakeWeb。

当然,这只是测试 Node_User 方面的事情。您说您还需要验证远程记录是否正确。为此,我建议在 Main_User 端编写测试。此类测试将模拟来自 Node_User 的传入 RESTful 请求并验证正确的结果。

仅当 Main_User 是您的应用程序时才有效。如果它是第三方服务,那么可能没有安全的方法来测试它。你可能只需要相信它的正确性。

【讨论】:

  • 我想我会采取第二种方法。这两个应用程序都属于我,它们都在本地主机环境中(从不接触生产数据)。但独立测试它们会更有用和安全。您知道在 Main_User 中处理播种数据和测试一致性的好方法吗?
  • 是的,我为此使用了机械师 (github.com/notahat/machinist)。我还将它与 Faker (faker.rubyforge.org) 集成,我用它来生成对当前测试不重要的所需模型属性。
猜你喜欢
  • 2016-07-24
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 2012-02-19
  • 2014-08-18
  • 2020-06-08
相关资源
最近更新 更多