我是MVC和IoC以及其他相关概念的新手。
我必须为旧项目编写单元测试用例。它使用结构图进行依赖注入。我使用的第三方dll暴露了一些接口。现在我必须为控制器类中的方法编写单元测试用例。
控制器的构造函数如下所示:
HomeController(IClientData clientdata)
{
_clientdata = clientdata;
}
//The clientdata was initialized
在我的测试用例中,如何初始化控制器类和接口IClientData
?将IClientData clientdata
传递给构造函数说:passing type as var
。
如何初始化/模拟IClientData
中的数据?我不知道接口是如何在dll中实现的。
答案 0 :(得分:2)
要在单元测试中使用接口的实现,您应该使用类似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
重要的是要注意,您不应该依赖单元测试中的依赖项实现,因为那时您不再需要测试代码单元 - 您正在编写集成测试。 / p>
答案 1 :(得分:0)
不要试图在单元测试中模仿现实世界。单元测试应该验证某个单元(这里是控制器)在给定一组前置条件时是否以指定的方式运行。
从你对Dan的答案的评论中我得知你似乎并不确切知道控制器在现实生活中获得了什么数据。如果您确切知道前提条件必须具有什么样以及控制器在给定条件下应如何表现,则只能编写单元测试。所以你有两个选择:
通过检查构建IClientData
所涉及的任何流程,尝试找出真实数据。这需要您检查dll的源代码。
分析控制器的源代码。它在哪里访问IClientData
?它执行了哪些检查?在此基础上,您可以得出所需要的结论以及输入如何影响控制器的行为。然后,您可以编写一份单元测试文档。
第二个选项意味着您创建了记录“is”状态的测试,即使该状态理论上可能与最初预期的状态不同。你可能没有其他选择,因为你回想起来写了测试。但至少单元测试的名称和内容将使这些隐含的事情非常明确。您可以将测试带给开发人员并询问他们:“这就是控制器的行为方式。它是否正确?”
无论您选择哪种方案,您都必须了解前提条件和预期行为。一旦你有了这个,你可以使用Moq
或任何其他方式写下存根或模拟,如丹的答案。对于每个测试用例,您可以编写一个或多个测试方法。每种方法只做一个逻辑断言。因此,每个测试方法也应该只需要一组非常有限的IClientData
模拟初始化。
TL;博士?