我正在使用 NUnit(在 .NET 框架上)测试 ASP.NET MVC 应用程序。
我正在尝试测试继承自
SomeController
的BaseController
方法。
在
BaseController
中,有一个无参数构造函数,用于读取配置、打开数据库连接、写入日志等。
当我对
SomeController
中的一种方法进行单元测试时,它不断调用BaseController
的构造函数。
我想模拟
BaseController
,这样它的构造函数就不会被调用。
我尝试模拟
BaseController
但不确定如何将其与 SomeController
一起用作模拟基类。
如何解决这个问题?等待答案和替代方法...
正如设计模式推荐,
优先考虑对象组合而不是类继承。
您遇到了继承的几个问题之一,因为它是用 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
。