【问题标题】:How to unit test MVC classes?如何对 MVC 类进行单元测试?
【发布时间】:2011-09-17 19:49:45
【问题描述】:
我一般是单元测试的新手,但想在 MVC 模式中实现它(使用 PHP)。现在我不确定如何解决这个问题。
是否应该将单元测试内置到框架中,或者我们只是创建一个名为 tests 的新文件夹并包含所有必要的类并对每个类进行单元测试?
简而言之,如果有模型M,它与框架本身也有一些耦合。那么为了测试模型,我应该在单元测试中包含框架的某些部分吗?
是否有一些很好的代码示例说明如何实现这一点。
【问题讨论】:
标签:
php
unit-testing
model-view-controller
【解决方案2】:
是否应该将单元测试内置到框架中,或者我们只是创建一个名为 tests 的新文件夹并包含所有必要的类并对每个类进行单元测试?
您绝对应该为它创建一个单独的文件夹。出于性能和调试的原因,将生产代码与测试混在一起通常不是一个好主意。
所以要测试模型,我应该在单元测试中包含框架的某些部分吗?
越少越好。单元测试应该几乎不需要依赖项。如果类A 依赖于B,你应该模拟B 以确保如果B 失败,它不会使A 也失败。
单元测试的主要优点(如果正确完成)是它可以让您轻松查明问题。如果A 由于其B 依赖关系而失败,您将首先查看A,然后 B。同样,如果B 依赖于C 并且C 失败,您将不得不查看A、B 和然后 C。这几乎破坏了单元测试的最大优势之一。如果所有测试都正确完成,C 中的失败不会导致 C 以外的任何其他地方失败,因此您将需要查找一个类来解决问题。
要真正使您的代码防错,您可以将单元测试与PHP assertions 结合使用:
$return = $this->addOne($some_param);
assert('$return == $some_param + 1');
顺便说一句,单元测试 MVC 与一般的单元测试没有区别。
【解决方案3】:
是否应该将单元测试内置到
框架,或者我们只是创建一个新的
名为测试的文件夹
如果您使用的是第三方框架,它通常会包含一些单元测试助手,但您需要将自己的测试类放入单独的文件夹中,以便(例如)发布您的不包含它们的分发软件。
包括所有必要的类并对每个类进行单元测试?
每个应用程序类通常有一个测试类。所以,如果你有一个模型类 M,你就会有一个测试类 M_Test(或者你采用的任何命名约定。)
如果你还不熟悉PHPUnit,你会想要抓住它并阅读他们的文档。