使用结构映射进行依赖注入的单元测试

本文关键字:依赖 注入 单元测试 结构 映射 | 更新日期: 2023-09-27 18:17:21

我是MVC和IoC等相关概念的新手。

我必须为一个老项目编写单元测试用例。它使用结构映射进行依赖注入。我使用的第三方dll公开了一些接口。现在我必须为控制器类中的方法编写单元测试用例。

控制器的构造函数是这样的:

HomeController(IClientData clientdata)
{
    _clientdata = clientdata;
}
//The clientdata was initialized

在我的测试用例中,我如何初始化控制器类和接口,如IClientData ?将IClientData clientdata传递给构造函数表示:passing type as var .

我如何初始化/模拟IClientData中的数据?我不知道这个接口是如何在dll中实现的

使用结构映射进行依赖注入的单元测试

对于在单元测试中使用接口的实现,您应该使用像Moq这样的模拟框架,并且您可以设置这些接口以返回满足您的测试需求的默认值。在这种情况下,您将创建一个Mock来设置您希望在这个特定的预期用例中看到的值,然后将其传递给控制器。

var mockClientData = new Mock<IClientData>();
mockClientData.SetupGet(data => data.MyProperty).Returns(3);
// mockClientData.Object.MyProperty now returns 3
mockClientData.Setup(data => data.MyMethod()).Returns(42);
// mockClientData.Object.MyMethod() now returns 42
// any other setup that you need done goes here
var controller = new HomeController(mockClientData.Object);
// the rest of your test as normal

重要的是要注意,你不应该在单元测试中依赖于依赖项的实现,因为那样你就不再是在测试一个代码单元——你是在编写一个集成测试。

不要试图在单元测试中模拟现实世界。如果给定一组前提条件,单元测试应该验证某个单元(这里是控制器)是否以指定的方式运行。

从你对Dan的回答的评论中,我发现你似乎并不知道控制器在现实生活中得到了什么数据。如果您确切地知道先决条件必须是什么样子,以及在这些条件下控制器应该如何表现,那么您才能编写单元测试。所以你有两个选择:

  • 尝试通过检查构建IClientData所涉及的任何进程来找出真实数据。这需要您检查dll的源代码。

  • 分析控制器源代码。它在哪里访问IClientData ?它执行什么检查?在此基础上,您可以得出所需内容以及输入如何影响控制器行为的结论。然后,您可以编写一个单元测试来记录。

第二个选项意味着您创建了记录"是"状态的测试,即使该状态在理论上可能偏离了最初的预期。您可能没有其他选择,因为您是在回顾中编写测试的。但至少单元测试的名称和内容将使那些隐式的东西变得非常显式。你可以将你的测试带给开发者并询问他们:"这就是控制器的行为方式。对吗?"

无论您选择什么选项,您都必须了解先决条件和预期行为是什么。一旦你有了这个,你就可以用Moq或任何其他方法写存根或模拟,就像丹的答案一样。对于每个测试用例,您都要编写一个或几个测试方法。每个方法只做一个逻辑断言。因此,每个测试方法也应该只需要非常有限的IClientData模拟初始化集。

tl,博士?