Unit testing 依赖注入和单元测试这个构造函数

Unit testing 依赖注入和单元测试这个构造函数,unit-testing,dependency-injection,c#-4.0,Unit Testing,Dependency Injection,C# 4.0,我在类中有一个构造函数和一个属性: private IMyCollectionObjects _myCollectionObjects; public MyClassConstructor(string message) { _myCollectionObjects = MyCollection.GetCollectionObejects(message); } 请尽可能详细地帮助我理解如何对这个构造函数进行单元测试 和GetCollectionObjects方法 我如何完全解耦

我在类中有一个构造函数和一个属性:

private IMyCollectionObjects _myCollectionObjects;

public MyClassConstructor(string message)
{
     _myCollectionObjects = MyCollection.GetCollectionObejects(message);
}
请尽可能详细地帮助我理解如何对这个构造函数进行单元测试 和GetCollectionObjects方法

我如何完全解耦 上课?你可以给出答案 使用任何国际奥委会,我都想 理解这个概念


谢谢。

首先,单元测试都是关于单元测试的,也就是说,一次只做一件事

请尽可能详细地帮助我理解如何对这个构造函数和GetCollectionObjects方法进行单元测试

首先,你有没有对你的MyCollection课程进行单元测试

如果不是,您应该从它开始,因为MyClassConstructor类依赖于它,这是依赖注入的基础。否则,你怎么知道你得到的结果是对的还是错的?您将无法测试并确保它能够完美地工作

如何完全解耦这些类?你可以用任何国际奥委会的语言给出答案,我想理解这个概念

我谦虚地认为,您必须有明确的理由使用依赖注入使对象依赖于另一个对象。一旦你让一个对象依赖于另一个,在我看来,将它们解耦是没有意义的。解耦的一种方法可能是使用企业库的Unity应用程序块

对这个构造函数进行单元测试

在测试这样的构造函数时,通常只需要检查三件事

构造函数不返回空值; 它返回的实例是预期的类型; 您期望通过其依赖项实例化的对象实际上已被灌输。
注意:这个测试是使用NUnit属性和断言方法编写的。使用你喜欢的任何东西。

这里是一些假设下你大概需要做的事情

假设MyCollection是一个静态类,GetCollectionObjects解析一个字符串并返回一个IMyCollectionObjects,那么首先需要将MyCollection设置为非静态,并将其传递给构造函数。类中使用的静态类/方法或多或少地根据定义创建了紧密耦合

现在您将构造传递消息字符串和MyCollection的类。构造函数将两者结合使用来填充IMyCollectionObjects类型的成员变量。为了确保这种情况按预期发生,您将需要一种方法来检查来自类外部的结果,即公共方法。因此,您需要一个属性getter来公开_myCollectionObjects

现在,您只需要从一个或多个测试中调用此构造函数,并在构造后检查属性,以确保成功地将字符串解析到集合中


注意,这实际上是一个集成测试,而不是一个离散单元测试。您正在测试解析是否成功。如果这里表示的类确实是您想要测试的,那么测试实际上只是检查是否调用了GetCollectionObjects。该调用的结果实际上无关紧要,因为您可能会有一个或多个单独的测试,以确保MyCollection上的方法GetCollectionObjects按预期工作。

对静态成员(如GetCollectionObjects)的依赖性很难测试,因为您无法在运行时替换其实现。这意味着您无法将MyClassConstructor的实例与GetCollectionObjects的实现细节完全隔离。如果不隔离测试目标,就不能真正将其视为单元测试

您可以重构此代码,使其完全解耦,从而完全可测试:

private readonly IMyCollectionObjects _myCollectionObjects;

public MyClassConstructor(IMyCollectionObjects myCollectionObjects)
{
    _myCollectionObjects = myCollectionObjects;
}
这使我们了解了如何从MyClassConstructor中将消息转换为集合,从而使类更简单、更内聚、耦合更少

private readonly IMyCollectionObjects _myCollectionObjects;

public MyClassConstructor(IMyCollectionObjects myCollectionObjects)
{
    _myCollectionObjects = myCollectionObjects;
}