在 Rails gem 上测试不同的数据库后端

发布于 2024-12-15 17:12:39 字数 355 浏览 0 评论 0原文

我需要指导实施我想要构建的 gem 的测试。它是一个小 gem,向 ActiveRecord::Base 添加了一个新的类方法。这个新方法将按需执行一些 SQL。

问题是,要执行的 SQL 取决于数据库后端。 SQLite、Postgres 和 MySQL 的情况有所不同。所有数据库后端的 ruby​​ 方法签名都是相同的 - 只有 SQL 发生了变化。

那么,我该如何对此进行测试呢?

澄清一下:我知道如何询问 ActiveRecord“您使用哪个数据库后端?”。我需要的是一种方法来告诉 RSpec/Minitest/TestUnit“将数据库后端更改为 Postgres,并再次尝试所有测试。然后是 MySQL”。

I need orientation implementing the tests of a gem I'd like to build. It's a small gem that adds a new class method to ActiveRecord::Base. This new method will execute some SQL on demmand.

Trouble is, the SQL to be executed depends on the database backend. It's different for SQLite, Postgres and MySQL. The ruby method signature is the same for all database backends - only the SQL changes.

So, how do I make the tests for this?

To clarify: I know how to ask ActiveRecord "what database backend are you on?". What I need is a way to tell RSpec/Minitest/TestUnit "change the database backend to Postgres, and try all tests again. And then MySQL".

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

对你再特殊 2024-12-22 17:12:39

看看 DataMapper 确实 这个。它们在运行规范时传递一个环境变量 ADAPTER,这会更改捆绑器安装/加载的 gem,并更改规范帮助程序中的连接设置。您应该能够执行类似的操作,基本上为每个可能的数据库后端运行一次完整套件。

当您运行 DM 核心规格时,它看起来像这样:

ADAPTER=mysql bundle install
ADAPTER=mysql bundle exec spec spec

ADAPTER=sqlite bundle install
ADAPTER=sqlite bundle exec rspec spec

我认为如果您想获得最佳覆盖范围,这是一个很好的方法。如果您想有选择地为测试的不同部分测试不同的内容,则只需使用条件,尽管(一般来说)我认为测试中的条件是一件坏事。

Take a look at how DataMapper does this. They pass an environment variable ADAPTER when running the specs, which alters the gems that are installed/loaded by bundler and changes the connection setup in the spec helper. You should be able to do something similar, basically running the full suite once for each possible database backend.

It looks like this when you run the DM core specs:

ADAPTER=mysql bundle install
ADAPTER=mysql bundle exec spec spec

ADAPTER=sqlite bundle install
ADAPTER=sqlite bundle exec rspec spec

I reckon if you want to get the best coverage, this is a good approach. If you want to selectively test different things for different parts of the tests, you'd just have to use conditionals, though (in general) I see conditionals in tests as a bad thing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文