gpt4 book ai didi

ruby-on-rails - shoulda-matchers 的 ActiveRecord 匹配器是否违反了 "test behavior not implementation"规则?

转载 作者:行者123 更新时间:2023-12-04 22:46:26 27 4
gpt4 key购买 nike

例如,如果我在我的规范中使用 should validate_presence_of,那只是测试我的模型中有 validate_presence_of 代码段,这就是测试实现。更重要的是,那个规范对于测试真正的问题是不是完全没有用,即“如果我不填写某个字段,模型会保存成功吗?”

最佳答案

一些 shoulda-matchers 的匹配器不测试实现,他们测试行为。 例如,查看 the source for allow_value (validate_presence_of 使用的):#matches? 实际上将实例的属性设置为值并检查是否会导致错误。所有测试验证(它的 ActiveModel matchers )的 shoulda-matchers 匹配器都以同样的方式工作;他们实际上测试了模型拒绝错误值。

请注意,如果您相信 ActiveModel 和 ActiveRecord 会经过全面测试,则匹配器是测试行为还是仅测试是否使用了宏都无关紧要。

对模型的验证进行单元测试绝对有用。 假设您正在执行 BDD 并实现一个创建模型实例的简单表单。您将首先编写一个验收测试(一个 Cucumber 或 rspec 场景)来测试正确填写表单并成功创建实例的快乐路径。然后,您将编写带有表单错误的第二个验收测试,以证明当表单中出现错误时,不会保存任何实例,并且该表单将重新显示并带有相应的错误消息。

一旦你得到了可能在表单中出现的错误之一的错误路径场景,你会发现如果你为其他错误编写更多的错误路径场景,它们将非常重复——唯一的事情不同的是错误的字段值和错误消息。然后你会有很多全栈场景,需要很长时间才能运行。所以不要写比第一个错误路径场景更多的东西。相反,只需为将捕获每个错误的验证编写单元测试。现在,您的大多数测试都变得简单而快速。 (这是从验收测试下降到单元测试以处理细节的通用 BDD 技术的一个特定示例。)

但是,我不觉得 shoulda-matchers 的 ActiveRecord matchers 很有用。 考虑到测试关联的匹配器,我发现我的验收测试总是迫使我将所有关联添加到我需要的模型中,并且在单元测试中没有什么可做的。如果您是严格测试驱动的,则测试应用程序不可见的数据库功能的 ActiveRecord 匹配器(例如 have_db_index )很有用,但我倾向于在那里懈怠。此外,就其值(value)而言,ActiveRecord 匹配器不测试行为(这将难以实现),仅使用相应的宏。

我确实发现 shoulda-matchers ActiveRecord 匹配器有用的一个异常(exception)是删除依赖对象。 我有时发现没有接受规范已经迫使我处理删除对象时关联对象发生的情况。实现这一点的 ActiveRecord 方法是将 :dependent 选项添加到 belongs_tohas_manyhas_one 关联。编写一个使用 shoulda-matchers 的 belong_tohave_manyhave_one 匹配器和 .dependent 选项的示例是我所知道的最方便的测试方法。

关于ruby-on-rails - shoulda-matchers 的 ActiveRecord 匹配器是否违反了 "test behavior not implementation"规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24075616/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com