9

假设我的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来测试这个代码路径的方法吗?

4

2 回答 2

12

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

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

于 2013-04-01T20:49:03.343 回答
10

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

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

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

于 2013-04-01T21:30:30.537 回答