【问题标题】:Issues while Unit testing in c#c#中单元测试时的问题
【发布时间】: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. 我知道我通过创建另一个构造函数违反了单元测试的主要目标。实际代码不会使用这个构造函数。但我也找不到其他方法!!
  2. 如果 1 不是正确的解决方案,请给我一个解决方案

TIA

【问题讨论】:

  • 你不能模拟在使用new 的类中创建的依赖项。在当前的形式中,您必须一次性测试整个事物,包括依赖项,因为它们不能被模拟。为了进行正确的测试,请通过构造函数注入所有内容,删除 new 并注入模拟进行测试。
  • 但我做不到。因为我需要dependency2.DoSomething();用于测试 DoSomeOperation() 的模拟设置。它是dependency2.DoSomething()中的一堆api调用。所以我需要嘲笑它。这就是为什么我必须编写另一个构造函数并将其注入仅用于 Unit test 。我想知道这种方法是否可行
  • 我同意,这样做会非常困难。您的第一个解决方案是正确的方法,将所有依赖项添加到构造函数并删除整个地方的news,就像使用Dependency1 一样。然后你可以模拟一切。

标签: c# .net unit-testing moq


【解决方案1】:

我知道我通过创建违反了单元测试的主要目标 另一个构造函数。实际代码不会使用这个构造函数。 但我也找不到其他方法!

我知道这对某些人来说是异端,但我相信在软件开发中没有硬性规定。这是一个权衡的游戏。如果改变构造函数的工作方式成本太高,你现在可以做这样的事情:

public  ClasslibraryService(Dependency1 dependency1, Dependency2 dependency2 = null)
{
    _dependency1 = dependency1;
    _dependency2 = dependency2 ?? new Dependency2(new Dependency3());
}

这为实际代码引入了一个默认实现,可以在单元测试中被覆盖。然后,您可以稍后重新访问此代码并使其更纯净。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2012-12-01
    • 2020-12-12
    • 2011-05-01
    • 2012-07-09
    • 2011-10-28
    相关资源
    最近更新 更多