如何测试ruby Mixin模块?

Dan*_*ley 12 ruby tdd unit-testing ruby-on-rails

我想知道测试ruby mixin模块的最佳方法,在这种情况下用于ActiveRecord模型,但实际上这是一个普遍的问题,适用于您使用mixin扩展的任何类.

尝试存储 mixin正在扩展的Class的所有必要功能,或者只是测试应用程序中存在和扩展的真实类是否更好?

Stubbing将删除测试的外部依赖性,但它无法在真实情况下测试mixin .如果测试失败,则可能是您的实现或您正在扩展的类已更改或中断.如果使用存根类进行测试,则测试可能会通过,但如果要扩展的类发生更改,则可能会破坏功能.

意见?

Joh*_*and 23

我并不完全清楚你要问的是什么,但我会假设它是这样的,"如果我有一个类,我用一个模块扩展该类,我应该在哪里测试由模块?"

就个人而言,当我编写一个模块用作mixin时,我会尝试确保它具有相当强大的测试,而不依赖于我最终可能计划将其混合到哪个类中.通常我会在测试套件中定义一个类,它只做扩展到模块,然后编写测试以确保测试类具有所有预期的功能.(你可以在我的Classy gem中看到这个例子,它只是mixin模块的集合.)如果模块是为了扩展ActiveRecord或其他类我没有任何控制权,我将其定义为vanilla an an尽可能使用ActiveRecord类并使用它,尽管理想情况下我会尽可能保持模块的功能与ActiveRecord的正交.

如果对ActiveRecord的更改导致您的测试中断,那么您在编写模块时的目标就会出现问题.如果您希望它对公众普遍可用且有用,那么您可能希望它与最新版本一起使用,并且那些失败的测试正准确地报告需要修复的错误.如果您只希望它与您在本地为您自己的项目运行的任何版本一起工作,那么您可以针对该版本运行测试,而您不必担心它会发生变化.

假设我已经控制了混入的类,我可能不会在类的测试中过于广泛地测试模块中的功能 - 这就是模块测试的用途.我会有一两个测试用例来确保它通常有效,并且我会测试特定于正在测试的类的特定交互或复杂性,并且可能保留它.