单元测试构造函数注入

本文关键字:注入 构造函数 单元测试 | 更新日期: 2023-09-27 18:07:00

假设我的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容器)。