Rails 中的测试关系被认为是最佳实践吗? [已关闭]

问题描述 投票:0回答:2

想知道 Rails 中的关系测试是否被广泛认为是最佳实践。 我们团队在测试关系方面存在分歧。

IMO这是多余的,即让每个

has_many :people
should have_many(:people)
进行测试,因为它看起来重复,只需从模型复制粘贴到测试 - 即我无法想象它停止工作或其他一些工作流程破坏它,唯一的打破它的方法 - 只是删除或更改行(但如果有人只是随机更改代码,那么有人也可以删除测试)。此外,它实际上并不测试关系(例如,如果公司返回具有适当
company_id
的人员,并且如果公司被摧毁 - 人们实际上被摧毁 - 因为在破坏验证或外键的情况下它实际上可能会失败),但它只是测试该关系已指定。 我们不会像该类那样测试对每个方法的响应,但如果我们进行测试 - 我们会测试方法的作用。

由于我们不测试其他静态事物,例如模板(例如没有逻辑的简单 HTML) - 我们假设 Rails 将生成指定的 HTML,因此除非有人更改它,否则不可能破坏它。

另一方面,有人认为关系是应用程序中极其重要的一部分,并且为了实现 100% 的覆盖率,也应该进行测试。

通常,在出现分歧的情况下,我们会寻求最佳实践,但我找不到任何提及关系测试的内容 - 要么做,要么不做。

您能帮我看看这是否是常见做法吗? (指向有关该或类似事物或您使用这些事物的经验的最佳实践的链接)

提前谢谢您

ruby-on-rails activerecord rspec relationship
2个回答
2
投票

您提出了一个基于意见的问题,很难通过来源来回答,因此您可能需要重新考虑您的问题。不过我会尝试一下。

我不知道最佳实践,但在我看来,任何可能意外更改的内容都应该进行测试,包括关系/关联。现在您想了解如何避免测试 Rails 逻辑,而只是测试关系是否已设置,但这并不难做到。

我贡献的最小测试套件都对是否存在预期的关系/关联进行了测试。

同样,我们的想法是,如果有人不小心在该行代码中删除或添加了一两个字符,则可以通过特定的测试来捕获它。不仅如此,故意删除这行代码还应该包括故意删除测试。

是的,当然,如果有人想完全删除该行代码并删除测试,他们应该能够做到。那时的假设是整个任务都是经过深思熟虑的。所以我认为这并不是避免测试的理由。测试是为了发现偶然的错误,而不是故意的行为。

此外,在我看来,仅仅因为测试看起来像复制/粘贴或重复,这也不是避免它的理由。应用程序代码越好,所有测试就越开始看起来重复或像复制/粘贴样板文件。这实际上是一件好事。这意味着应用程序代码只做了一件小事(而且可能做得很好)。重复性测试越多,它们就越容易编写,就越有可能被编写,并且您也可以更多地重构、简化和干燥它们。

在我看来,这应该是一种最佳实践,而且我个人合作过的十几位 Rails 开发人员并没有对我提出太多反对。从更广泛的角度来看,

shoulda-matchers
为此拥有特定的匹配器,这意味着有足够多的其他开发人员想要这种功能。

这是一个在不测试 Rails 逻辑本身的情况下测试关系/关联的最小示例:

  test 'contains a belongs_to relationship to some models' do
    expected = [:owner, :make].sort
    actual   = Car.reflect_on_all_associations(:belongs_to).map(&:name).sort

    assert_equal(expected, actual)
  end

就您的观点而言,它不会测试代码的实际行为,并且仅在您期望在模型上编写的方法测试方法本身的实际行为时测试关系是否已定义,而不是只是这样定义的...
这是因为您作为最终开发人员编写了该模型方法,因此应该测试其行为。但您不想测试 Rails 核心中存在的逻辑,因为 Rails 团队已经为此编写了测试。
换句话说,不测试关联的功能,而只测试它的定义是非常有意义的,因为该功能已经由 Rails 测试套件测试过。


-1
投票

在我们公司,我们不测试 Rails 内部逻辑。 我们不检查 Rails 是否正确处理

has_many
belongs_to
等。 那是 Rails 实习生的事情,你不必担心。

通常你有足够多的其他东西来测试。

© www.soinside.com 2019 - 2024. All rights reserved.