单元测试构造函数注入
本文关键字:注入 构造函数 单元测试 | 更新日期: 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容器)。