单元测试构造函数注入

mar*_*d13 9 c# constructor unit-testing dependency-injection 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();
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有一个单元测试的构造函数,我传入null来验证是否ArgumentNullException抛出了.我是否需要为我的构造函数进行第二次单元测试,在这里我传入一个有效的IService并验证是否已this.service设置(需要公共访问器)?

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

Jus*_*ony 12

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

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


Ste*_*ven 9

这些测试是多余的,因为当构造函数不起作用时,没有其他测试会成功.

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

我说完全跳过这些空检查并信任你的DI容器(或选择你可以信任的DI容器).