1

我很难决定或理解在 Laravel 中进行测试的最佳方法。

我真的很喜欢 PHPSpec 测试的行为方面,尽管它与测试 Eloquent 模型或任何与活动记录 ORM 相关的东西都不兼容。

在测试服务提供者 PHPSpec 之类的东西时,似乎是要走的路。

** 是否需要用 PHPUnit 之类的东西测试模型,然后用 PHPSpec 之类的东西测试其他非 ORM 层,例如服务提供者?***

4

2 回答 2

5

我不知道 Laravel,但是阅读人们在单元测试方面遇到的问题告诉我,那里有很多设计问题。我知道 Laravel 的那些有问题的功能是可选的,所以有希望!

在另一个问题的回答中查看我对 PhpSpec 与 PhpUnit 的比较:First Shot at Testing Laravel 4 apps (PHPSpec/BDD vs. PHPUnit/TDD)

我猜你在使用 PhpSpec 和 Laravel 时会遇到很多问题,而且通常你必须避免指定 Laravel 特定的怪癖,或者避免它们(外观是可选的,你可以使用适当的依赖注入)。我的目标是让尽可能多的代码独立于框架并适当地对它们进行单元测试。然后,您可以拥有一层薄薄的框架粘合代码,覆盖功能或集成测试。应用依赖注入。

作为一个取自 Symfony 和 Doctrine 的例子,我通常不为 Doctrine 存储库编写规范。好吧,我只希望他们实现某个接口。就这样。其余的都包含在我的验收测试中。验证存储库是否使用查询构建器来生成预期的查询没有多大价值。真的没意思。

回到工具,我可以看到自己为不同类型的测试混合了不同类型的测试工具:

  • phpspec - 单元测试 - 我将在这个级别上编写大部分测试
  • behat - 验收测试
  • phpunit - 集成和功能测试 - 我将有少量这些,因为它们脆弱且缓慢。
于 2014-12-21T10:54:10.080 回答
3

这实际上与 Laravel 没什么关系,实际上是 ActiveRecord 作为模式的一个基本问题。当你使用 ActiveRecord 时,你牺牲了可测试性。ActiveRecord 与数据库持久性不可调和。

如果您希望使用测试优先的方法,我建议您使用不同的持久性方法。编写您的对象以一起运行。然后稍后使用 Doctrine 之类的东西附加持久性。

如果您仍然想使用 ActiveRecord,那么您将需要做一些不同的事情。Laravel 不强制使用 Eloquent。但是,它确实是开箱即用的。ActiveRecord 是一个或多或少适合编写 CRUD 应用程序的工具。如果您正在做更复杂的事情,我建议您使用 Doctrine。

于 2014-12-21T11:54:04.750 回答