为什么在Rails中应该使用RSpec或Shoulda?

33

我正在搭建一个Rails应用程序,我刚刚完成了一些单元测试,我的朋友说,显然fixtures已经不再流行了,现在人们正在使用RSpec或shoulda。我想知道使用这些其他工具包的实际好处是什么。非常感谢任何信息。

-fREW

8个回答

22

1
我完全同意webmat的看法。我真的很难理解RSpec语法,因为它有太多的语法糖。它将普通的短语转换为代码,但你必须弄清它应该做什么!这个学习曲线很陡峭,而我又很懒。 - srboisvert
我曾经对糖衣语法有些怀疑,但是在阅读了http://rdoc.info/gems/rspec-expectations/2.4.0/RSpec/Matchers之后,使用RSpec的语法写断言已经没有任何问题了(也许自你回答以来的2.5年间该文档变得更好了^^)事实上,我现在更喜欢RSpec的期望,而不是Test::Unit的断言(这仍然与“英文可读性”(错误)特性毫不相关)。 - Jo Liss

17

7

这里有两个不同的事情:

第一件事是选择用于编写测试/规范的框架。您可以在Test::Unit、RSpec、Shoulda等之间进行选择。选择是您想要进行传统TDD(Test::Unit)还是您更喜欢像David Chemlinsky(RSpec和在某种程度上Shoulda)开发人员所倡导的关于指定行为的替代思考方式。

第二件事是如何处理测试数据。有Rails fixtures以及专为其他目标设计的替代品,例如FixtureReplacement插件。在Rails 2.0之前,fixtures存在重大且有记录的实际问题。许多实际问题已在Rails 2.0中得到解决。但是fixtures可能会导致无意中测试耦合,而某些替代方法则试图避免这种情况。


5

RSpec更加强大,因为测试的阅读和编写更加容易。在使用模拟和桩时,它也非常优雅,一旦您在测试中开始使用它们,这个概念将变得非常有用。在一个简单的测试应用程序(非Rails!)中尝试一下,您将看到与等效标准测试相比,您的规范是多么优雅。


4

2
如果你正在构建一个大型应用程序,没有一个编写解耦代码并且能够使用黑盒测试进行良好测试的团队,并准备充分采用/调试大量模拟和存根,则不要使用工厂方法。
无论在哪里阅读关于“工厂函数有多么棒”的文章,你都会看到一个小提示,即由于它们比夹具慢一点,所以工厂在大型应用程序中可能不可行。
但是,“稍微慢”实际上是数量级的差异。
只要保持夹具有组织,使用标签进行ID识别,那么工厂将没有显着更容易编码。在某些情况下,工厂更难调试。
就在今晚,我将单个工厂转换为固定夹具,使用它的测试文件运行时间从65秒降至15秒,尽管在该测试文件中仅约有15%的测试使用该工厂。
如果您使用minitest,则可以按随机顺序运行测试。这将快速揭示测试之间的数据耦合关系。(不确定rspec是否有随机化测试顺序的选项)

1

Test::Unit适用于小型应用程序。但是使用像Shoulda或RSpec这样的测试框架有很多好处,例如上下文!

我不认为Shoulda和RSpec是二选一的关系。当涉及到单个断言测试时,我使用Shoulda代替RSpec。我真的很喜欢Shoulda的一行代码,但在RSpec中编写匹配器要容易得多。因此,我的建议是在最合适的地方使用不同的测试工具。


0

你可以使用像Cucumber这样的测试框架,它比RSpec更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接