c# - 一个单元应该如何测试 .NET MVC Controller ?

标签 c# asp.net-mvc-3 unit-testing controller

我正在寻找有关 .NET mvc Controller 的有效单元测试的建议。

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

我还阅读了一些文章,推荐诸如检查返回的 View 模型类型是否正确之类的内容。我可以看到它提供了一些值(value),但仅凭它似乎并不值得编写多行模拟代码(我们的应用程序的数据模型非常庞大和复杂)。

谁能建议一些更好的 Controller 单元测试方法或解释为什么上述方法有效/有用?

谢谢!

最佳答案

Controller 单元测试应该测试操作方法中的代码算法,而不是数据层中的代码算法。这是模拟这些数据服务的原因之一。 Controller 期望从存储库/服务/等接收某些值,并在从它们接收到不同信息时采取不同的行动。

您编写单元测试来断言 Controller 在非常特定的场景/环境中以非常特定的方式运行。您的数据层是将这些情况提供给 Controller /操作方法的应用程序的一部分。断言服务方法被 Controller 调用是有值(value)的,因为您可以确定 Controller 从另一个地方获取信息。

检查返回的 View 模型的类型很有值(value),因为如果返回错误的 View 模型类型,MVC 将抛出运行时异常。您可以通过运行单元测试来防止这种情况在生产中发生。如果测试失败,那么 View 可能会在生产中抛出异常。

单元测试很有值(value),因为它们使重构变得更加容易。您可以更改实现,并通过确保所有单元测试都通过来断言行为仍然相同。

评论 #1 的回答

如果更改被测方法的实现要求更改/删除较低层的模拟方法,则单元测试也必须更改。然而,这不应该像您想象的那样经常发生。

典型的红-绿-重构工作流要求在编写单元测试之前编写单元测试。 (这意味着在短时间内,您的测试代码无法编译,这就是为什么许多年轻/没有经验的开发人员难以采用红绿重构的原因。)

如果您先编写单元测试,您就会知道 Controller 需要从较低层获取信息。您如何确定它会尝试获取该信息?通过模拟出提供信息的下层方法,并断言下层方法被 Controller 调用。

当我使用术语“改变实现”时,我可能说错了。当必须更改 Controller 的操作方法和相应的单元测试以更改或删除模拟方法时,您实际上是在更改 Controller 的行为。根据定义,重构意味着在不改变整体行为和预期结果的情况下更改实现。

Red-green-refactor 是一种质量保证方法,有助于防止代码中的错误和缺陷出现。通常,开发人员更改实现以在错误出现后将其删除。所以重申一下,你担心的情况应该不会像你想象的那样经常发生。

关于c# - 一个单元应该如何测试 .NET MVC Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8818207/

相关文章:

C# DispatcherHelper.CheckBeginInvokeOnUI 不会在 UnitTest 上运行

c# - 无法将类型为 "object {System.Collections.Generic.List<string[]>}"的对象转换为 ICollection<object>

c# - 如何在 Asp.net MVC 中检测爬虫

asp.net-mvc - DisplayForModel 的问题

unit-testing - 如何进行不确定性的单元测试?

c# - 允许用户打印 C# WPF FlowDocument 应用程序中的特定页面

c# - 是否可以使用 JSON.Net 将 JSON 反序列化为 List<MyObject<T,K>>

c# - MVC 3 任务等待

android - 基于 gradle 的项目缺少 RobolectricContext

swift - 无法在 xctest 中导入主应用程序模块