NUnit:如何防止调用基类构造函数或模拟基类构造函数(ASP.NET 使用 NUnit 进行 MVC 控制器方法测试)

NUnit : How to prevent calling base class constructor or mocking base class constructor (ASP.NET MVC controller method testing with NUnit)

提问人:Man Mohan Mundhra 提问时间:11/17/2023 最后编辑:Mark SeemannMan Mohan Mundhra 更新时间:11/17/2023 访问量:33

问:

我正在使用 NUnit(在 .NET 框架上)测试一个 ASP.NET MVC 应用程序。

我正在尝试测试继承自 的方法。SomeControllerBaseController

其中有一个无参数构造函数,用于读取配置、打开数据库连接、写入日志等。BaseController

当我对其中一种方法进行单元测试时,它会不断调用 的构造函数。SomeControllerBaseController

我想模拟一下,这样它的构造函数就不会被调用。BaseController

我尝试过模拟,但不确定如何与模拟基类一起使用。BaseControllerSomeController

如何解决这个问题?等待答案和替代方法......

asp.net .net asp.net-mvc visual-studio nunit

评论


答:

1赞 Mark Seemann 11/17/2023 #1

正如设计模式所建议的,

优先于对象组合而不是类继承。

您遇到了继承的几个问题之一,因为它是在 C# 等主流语言中实现的。AFAIK,这个问题没有直接的解决方案。

要么更改基类,使其构造函数不执行所有隐式工作(构造函数应该简单),要么不继承自 。BaseController

在后一种情况下,支持构造函数注入,而不是从基类继承。

public sealed class SomeController
{
    private readonly ISomeDependency dep;

    public SomeController(ISomeDependency dep)
    {
        this.dep = dep;
    }

    // Use this.dep in methods...
}

这应该使您能够通过提供依赖项的 Test Double 进行测试。SomeController

评论

0赞 Man Mohan Mundhra 11/20/2023
谢谢标记。我正在开发一个遗留应用程序。按照您的建议制定解决方案。在此之前,需要弄清楚现有代码中的更改。