Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller 我应该测试我的控制器(MVC)吗?_Model View Controller_Controller_Mocking_Tdd_Integration Testing - Fatal编程技术网

Model view controller 我应该测试我的控制器(MVC)吗?

Model view controller 我应该测试我的控制器(MVC)吗?,model-view-controller,controller,mocking,tdd,integration-testing,Model View Controller,Controller,Mocking,Tdd,Integration Testing,我已经使用TDD好几个月了,现在我想学习如何测试我的控制器(MVC) 单元测试是通过测试每个功能的最小单元来进行的。有时,控制器并不小。它们从模型中获取数据,然后传递给视图 我应该如何对控制器进行单元测试?我应该模拟控制器的依赖关系吗 控制器测试是否被视为集成测试 谢谢。昨天问了同样的问题: 在我看来,是的,测试控制器是有意义的。你可以: 模拟它们背后的服务,因此只测试控制器本身更容易 让服务保持不动,并进行集成测试 我做TDD已经有很长时间了。我用ASP.NETMVC做TDD已经一年多了

我已经使用TDD好几个月了,现在我想学习如何测试我的控制器(MVC)

单元测试是通过测试每个功能的最小单元来进行的。有时,控制器并不小。它们从模型中获取数据,然后传递给视图

我应该如何对控制器进行单元测试?我应该模拟控制器的依赖关系吗

控制器测试是否被视为集成测试


谢谢。

昨天问了同样的问题:

在我看来,是的,测试控制器是有意义的。你可以:

  • 模拟它们背后的服务,因此只测试控制器本身更容易
  • 让服务保持不动,并进行集成测试

我做TDD已经有很长时间了。我用ASP.NETMVC做TDD已经一年多了

我从规范规则开始:“没有单元测试就没有代码行”,所以我测试了所有东西——包括控制器。控制器必须经过测试,这是MVC框架的目标之一——使这些东西可测试

对于小型应用程序,这种方法非常有效。几乎所有的逻辑都放在控制器内,所有的东西都经过了很好的测试

但只要我继续使用MVC,我就开始改变主意。我尽量使控制器保持苗条。理想情况下,只需将调用委托给某个业务对象并包装结果。其余的是通过过滤器

这对我也很有效!我现在有了单独实现/测试的业务对象,因此控制器只是集成点。没有理由测试集成点,因为它太小了

关于集成测试:我还没有遇到实际需要的情况。不要忘记,控制器总是依赖于构造函数注入的抽象。只要您对这些抽象如何工作有“良好”的假设,您就可以创建适当的单元测试。失败后,只需更正单元测试


集成测试很重要,也很有用,但我尽量少创建这些测试。

我对控制器采取与Alexander B相同的方法。我的控制器又薄又哑。但是,我仍然为它们编写测试,以确保它们正确调用业务或服务对象并传递正确的参数

上周我终于发现了一个实际的bug,这可能是最好的说明。我有一个控制器,允许管理员批准或拒绝用户的请求,它有两个视图,一个是未完成请求的列表视图,另一个是每个请求的详细视图。两种观点都可以批准或拒绝。控制器调用的服务有一系列其他公开的方法,包括一个用于更改请求状态的方法。。。你可以看到这是怎么回事。列表视图调用了正确的方法来批准或拒绝并触发工作流,详细信息视图只调用了更改状态方法,没有启动任何进一步的工作流。这是我的编码错误,但就我的一生而言,我已经很久看不到它了——工作流在后台线程中运行,我花了一周时间在这些线程中运行,假设这是该部分中的错误

对我来说也是如此

  • 一旦控制器将数据传递到其他地方,它就需要进行测试
  • 如果控制器检查模型有效性,则需要进行测试(如果 有人拿走了支票?)
等等。

要为控制器开发单元测试,自然的方法是模拟控制器所依赖的接口(它控制的“事物”,我们称它们为
icontrolable
s)。然后,可以验证控制器是否以预期方式操纵受控对象

如果控制器和受控对象之间的交互很复杂,则专用集成测试可能有意义。例如,可能有一系列类实现了
icontrolable
——这些实现中的每一个都能与控制器很好地协同工作吗?可能多个不同的
IControllable
将交互(使用相同的资源)?或者,
IControllables
可能有一些复杂的方法来配置它们,从而影响它们的行为?测试这一点的一种方法是编写一个可重用的测试套件,在其中输入一系列可疑的
icontrolable
实现或它们的组合


最后但并非最不重要的一点是,TDD也是关于验收测试的。因此,在进行TDD时,您还将进行高级端到端测试,以执行最终用户能够识别的场景。最有可能的是,这些操作也会使用控制器——这样也可以测试控制器和(某些)类之间的正确集成。

您首先编写模型的测试,对吗?你什么时候写集成测试?请举一个例子,应用服务