【发布时间】:2021-10-09 02:15:27
【问题描述】:
我有一个类库项目,它将被一些遗留代码和一些现代化代码使用。我想简要说明一下我面临的问题。
class ClasslibraryService
{
private Dependency1 _dependency1;
private Dependency2 _dependency2
public ClasslibraryService(Dependency1 dependency)
{
_dependency1 = dependency;
// this dependency2 could be something like logger or Bearer token service which I do not want to expose to consuming application
_dependency2 = new Dependency2(new Dependency3());
}
public int DoSomeOperation()
{
var res = _dependency2.DoSomething();
return _dependency1.DoSomeOperation(res);
}
}
所以基本上我必须在构造函数中新建而不使用构造函数注入依赖项。
现在在对这个类进行单元测试时,我创建了另一个构造函数,它通过构造函数获取所有依赖项。这工作正常。
但这里的问题是
- 我知道我通过创建另一个构造函数违反了单元测试的主要目标。实际代码不会使用这个构造函数。但我也找不到其他方法!!
- 如果 1 不是正确的解决方案,请给我一个解决方案
TIA
【问题讨论】:
-
你不能模拟在使用
new的类中创建的依赖项。在当前的形式中,您必须一次性测试整个事物,包括依赖项,因为它们不能被模拟。为了进行正确的测试,请通过构造函数注入所有内容,删除new并注入模拟进行测试。 -
但我做不到。因为我需要dependency2.DoSomething();用于测试 DoSomeOperation() 的模拟设置。它是dependency2.DoSomething()中的一堆api调用。所以我需要嘲笑它。这就是为什么我必须编写另一个构造函数并将其注入仅用于 Unit test 。我想知道这种方法是否可行
-
我同意,这样做会非常困难。您的第一个解决方案是正确的方法,将所有依赖项添加到构造函数并删除整个地方的
news,就像使用Dependency1一样。然后你可以模拟一切。
标签: c# .net unit-testing moq