2012-01-04 48 views
0

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

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

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

当创建一个新的Node_User,Node_User调用Main_User它创建了一个用户,并返回与Node_User使用创建的Node_User一些数据。

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

谢谢!

+0

您正在编写单元测试或集成测试吗? – 2012-01-04 23:23:27

+0

我想这将是更多的集成测试。对Main_User应用程序的调用是作为Net :: HTTP调用在Node_User模型中完成的。 我们发送Main_User几个参数。然后,它创建一个Main_User记录并将信息发送回Node_User 然后数据稍微按摩一下,最后创建Node_User记录。 我想确保我们得到的是Main_User在发送给Main_User的参数上创建它。 – roloenusa 2012-01-04 23:38:03

回答

1

是的,理论上,如果您有权访问该数据库的user/pass/hostname,则可以查询远程数据库。 (搜索“Rails multiple databases。”)

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

因此,我会建议以某种方式嘲笑远程数据库。一种选择是VCR。这真的很酷,但它要求您至少在远程数据库上运行一次,因为它必须记录第一次运行。另一种选择是使用VCR的基础工具之一,如FakeWeb。

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

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

+0

我想我会采取第二种方法。这两个应用程序都属于我,它们都在本地主机环境中(从不接触生产数据)。但独立测试会更有用和安全。您是否知道在Main_User中处理种子数据和测试一致性的好方法? – roloenusa 2012-01-05 01:29:53

+0

是的,我为此使用了Machinist(https://github.com/notahat/machinist)。我还将其与Faker(http://faker.rubyforge.org/)集成,我使用它来生成对当前测试不重要的所需模型属性。 – rlkw1024 2012-01-05 16:35:54