我很难决定或理解在Laravel中测试的最佳方法。
我真的很喜欢 PHPSpec 测试的行为方面,尽管它与测试 Eloquent 模型或任何与活动记录 ORM 相关的内容不兼容。
在测试诸如服务提供商之类的东西时,PHPSpec似乎是要走的路。
** 是否需要使用PHPUnit之类的东西测试模型,然后使用PHPSpec之类的东西测试其他非ORM层,例如服务提供商?
我不了解 Laravel,但是阅读人们对单元测试的问题告诉我那里有很多设计问题。我知道Laravel的那些有问题的功能是可选的,所以有希望!
请参阅我对PhpSpec与PhpUnit的比较,以回答另一个问题:测试Laravel 4应用程序的第一枪(PHPSpec/BDD与PHPUnit/TDD(
我猜你在使用PhpSpec和Laravel时会遇到很多问题,而且通常你必须避免指定Laravel特定的怪癖,或者避免它们(外观是可选的,你可以使用适当的依赖注入(。我的目标是让尽可能多的代码独立于框架并正确地对它们进行单元测试。然后,您可以拥有一层薄薄的框架粘合代码,其中包含功能或集成测试。应用依赖关系注入。
举个来自Symfony和Doctrine土地的例子,我通常不会为Doctrine存储库编写规范。好吧,我只希望他们实现某个接口。就这样。其余的都包含在我的验收测试中。验证存储库是否使用查询生成器生成预期的查询没有多大价值。真的没有意义。
回到工具,我可以看到自己混合了不同类型的测试工具进行不同类型的测试:
- phpspec - 单元测试 - 我将在这个级别上编写大部分测试
- 贝哈特 - 验收测试
- phpunit - 集成和功能测试 - 我会有一小部分,因为它们很脆弱且缓慢。
这实际上与Laravel没有多大关系,实际上是ActiveRecord作为一种模式的一个基本问题。当您使用ActiveRecord时,您会牺牲可测试性。活动记录与数据库持久性有着不协调的链接。
如果您希望使用测试优先的方法,我建议使用不同的持久性方法。编写对象以协同工作。然后用类似教义的东西来附加坚持。
如果你想使用ActiveRecord,那么你将需要做一些不同的事情。Laravel不会强迫使用Eloquent。但是,它确实开箱即用。ActiveRecord是一种或多或少适合编写CRUD应用程序的工具。如果你正在做一些更复杂的事情,我会建议教义。