首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >一个单元应该如何测试一个.NET MVC控制器?

一个单元应该如何测试一个.NET MVC控制器?
EN

Stack Overflow用户
提问于 2012-01-11 19:08:16
回答 4查看 71K关注 0票数 76

我正在寻找关于.NET mvc控制器的有效单元测试的建议。

在我工作的地方,许多这样的测试都使用moq来模拟数据层,并断言调用了某些数据层方法。这对我来说似乎没有用,因为它本质上是验证实现没有改变,而不是测试API。

我也读过一些文章,推荐检查返回的视图模型的类型是否正确。我可以看到它提供了一些价值,但仅凭它似乎不值得编写许多行模拟代码(我们的应用程序的数据模型非常大和复杂)。

有没有人能建议一些更好的控制器单元测试方法,或者解释为什么上述方法是有效的/有用的?

谢谢!

EN

回答 4

Stack Overflow用户

发布于 2012-01-11 20:50:15

你应该首先让你的控制器节食。然后你就可以对它们进行have fun单元测试了。如果它们很胖,并且您已经将所有的业务逻辑都塞入其中,我同意您将在您的单元测试中到处嘲笑这些东西,并抱怨这是浪费时间。

当您谈到复杂的逻辑时,这并不一定意味着此逻辑不能在不同的层中分离,每个方法都要单独进行单元测试。

票数 27
EN

Stack Overflow用户

发布于 2012-01-11 20:46:18

我看不出对控制器进行单元测试有多大意义,因为它通常只是连接其他部分的一段代码。单元测试通常包括大量的模拟,只是验证其他服务是否正确连接。测试本身是实现代码的反映。

我更喜欢集成测试--我不是从一个具体的控制器开始,而是从一个Url开始,并验证返回的Model是否具有正确的值。在Ivonna的帮助下,测试可能如下所示:

代码语言:javascript
复制
var response = new TestSession().Get("/Users/List");
Assert.IsInstanceOf<UserListModel>(response.Model);

var model = (UserListModel) response.Model;
Assert.AreEqual(1, model.Users.Count);

我可以模拟数据库访问,但我更喜欢一种不同的方法:设置一个内存中的SQLite实例,并在每次新测试中重新创建它,以及所需的数据。它使我的测试足够快,但我没有复杂的模仿,而是让它们变得清晰,例如,只需创建并保存一个用户实例,而不是模仿UserService (这可能是一个实现细节)。

票数 7
EN

Stack Overflow用户

发布于 2012-01-11 19:18:34

通常,当您讨论单元测试时,您测试的是一个单独的过程或方法,而不是整个系统,同时试图消除所有外部依赖。

换句话说,当测试控制器时,你是一个接一个的编写测试方法,你甚至不需要加载视图或模型,这些都是你应该“模拟”出来的部分。然后,您可以更改模拟以返回值或错误,这些值或错误在其他测试中难以重现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8818207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档