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方法进行测试.以免你的测试变得脆弱.
您只想测试您的服务是否正确使用.你不应该关心它是如何存储的.
这些测试是多余的,因为当构造函数不起作用时,没有其他测试会成功.
说实话,我甚至懒得在我的构造函数中编写那些空检查.原因很简单:DI容器不允许使用空引用自动连接构造函数(或者至少不是默认情况下),因此不可能使用空值构造类型(当由容器自动连接时) .所以它只是增加了无用的代码,这使我在需要高代码覆盖率时添加无用的测试.
我说完全跳过这些空检查并信任你的DI容器(或选择你可以信任的DI容器).