我想知道测试 ruby mixin模块的最佳方法,在这种情况下与ActiveRecord模型一起使用,但实际上这是适用于任何类的一般问题用mixin扩展。
尝试存储mixin正在扩展的类的所有必要功能,或仅测试真实类是否更好?应用?
Stubbing将删除测试的外部依赖项,但它无法在真实情况下测试mixin 。如果测试失败,则可能是您的实现或您正在扩展的类已更改或中断。如果使用存根类进行测试,则测试可能会通过,但如果要扩展的类发生更改,功能可能会被破坏。
评论
答案 0 :(得分:23)
我并不完全清楚你在问什么,但我会假设它有点像“如果我有一个课程,并且我用一个模块扩展该课程,我应该在哪里测试模块提供的功能?“
就个人而言,当我编写一个模块用作mixin时,我会尝试确保它具有相当强大的测试,而不依赖于我最终可能计划将其混合到的任何类。通常我会在测试套件中定义一个类,它只做扩展到模块,然后编写测试以确保测试类具有所有预期的功能。 (你可以在我的Classy gem中看到这个例子,它只是一个mixin模块的集合。)如果模块是为了扩展ActiveRecord或其他类我没有任何控制,我会尽可能将ActiveRecord类定义为vanilla并使用它,尽管理想情况下我会尝试尽可能保持模块的功能与ActiveRecord的正交。
如果对ActiveRecord的更改导致您的测试中断,那么您在编写模块时的目标就会出现问题。如果您希望它对公众普遍可用且有用,那么您可能希望它与最新版本一起使用,并且那些失败的测试正准确地报告需要修复的错误。如果您只希望它与您在本地为您自己的项目运行的任何版本一起使用,那么您可以针对该版本运行测试,而不必担心它会发生变化。
假设我已经控制了混入的类,我可能不会在类的测试中过于广泛地测试模块中的功能 - 这就是模块测试的用途。我会有一两个测试用例来确保它通常有效,我会测试任何特定的交互或特定于被测试类的复杂性,并且可能会留下它。