C# 单元测试构造函数注入

C# 单元测试构造函数注入,c#,unit-testing,dependency-injection,constructor,constructor-injection,C#,Unit Testing,Dependency Injection,Constructor,Constructor Injection,假设我的Foo类具有以下内容: readonly IService service; public Foo(IService service) { if (service == null) throw new ArgumentNullException("service"); this.service = service; } public void Start() { service.DoStuff(); } 到目前为止,我有一个针对构造函数的

假设我的
Foo
类具有以下内容:

readonly IService service;

public Foo(IService service) 
{
    if (service == null)
        throw new ArgumentNullException("service");

    this.service = service;
}

public void Start()
{
    service.DoStuff();
}
到目前为止,我有一个针对构造函数的单元测试,其中我传入null以验证是否抛出了
ArgumentNullException
。我是否需要为我的构造函数进行第二次单元测试,其中我通过了有效的
IService
,并验证
this.service
是否已设置(这需要一个公共访问器)


或者我应该仅仅依靠我的单元测试的
Start
方法来测试这个代码路径吗?

设置
this.service
是一个实现细节,所以您应该只测试它是否在预期的地方使用,并通过
Start
方法进行测试。以免你的测试变得脆弱


您只想测试您的服务是否被正确使用。您不应该关心它是如何存储的。

这些测试是多余的,因为当您的构造函数不工作时,其他测试都不会成功

老实说,我甚至不再费心在构造函数中写那些空检查了。原因很简单:DI容器不允许您使用空引用自动连接构造函数(或者至少默认情况下不允许),因此不可能使用空值(当容器自动连接时)来构造类型。所以它只是添加了无用的代码,这使得我在需要高代码覆盖率时添加了无用的测试


我建议完全跳过这些空检查并信任您的DI容器(或者选择一个您可以信任的DI容器)。

您可以做的其他事情是完全删除ctor,并让它由T4模板生成,如此项目所做的:。不需要对生成的代码进行单元测试。