C# 在继承ControllerBase的控制器内声明构造函数
我正在从事使用ASP.NETCore2.1的web应用程序项目。在开发API的同时,我们还尝试使用MSTest框架对其进行单元测试 我的控制器继承自C# 在继承ControllerBase的控制器内声明构造函数,c#,unit-testing,asp.net-core,asp.net-core-2.0,mstest,C#,Unit Testing,Asp.net Core,Asp.net Core 2.0,Mstest,我正在从事使用ASP.NETCore2.1的web应用程序项目。在开发API的同时,我们还尝试使用MSTest框架对其进行单元测试 我的控制器继承自控制器库。在我的测试台上,我正在使用Moq框架模拟我的业务层。当我从测试方法调用控制器时,我需要将一个模拟的业务实例传递给控制器,我正试图为其声明参数化构造函数 它在测试用例中运行良好,但我的正常流程受到干扰。我甚至尝试使用参数化和无参数构造函数 这适用于继承APIController的点框架 公共类BookingController:Control
控制器库
。在我的测试台上,我正在使用Moq框架模拟我的业务层。当我从测试方法调用控制器时,我需要将一个模拟的业务实例传递给控制器,我正试图为其声明参数化构造函数
它在测试用例中运行良好,但我的正常流程受到干扰。我甚至尝试使用参数化和无参数构造函数
这适用于继承APIController的点框架
公共类BookingController:ControllerBase{
BusinessManager business=新BusinessManager();
//非参数化构造函数
公共BookingController(){}
//参数化构造函数
公共预订控制器(BusinessManager mockedBusiness){
this.business=模拟业务;
}
}
从UI调用时应使用非参数化构造函数。
参数化应仅在通过某个实例从测试台调用时起作用。在原始代码中
BusinessManager business = new BusinessManager();
将控制器与依赖项紧密耦合,并被视为代码气味。这就是为什么为了能够单独测试控制器,您不得不尝试一种变通方法
使用并保留参数化构造函数
public class BookingController: ControllerBase {
private readonly BusinessManager business;
//Parameterized Constructor
public BookingController(BusinessManager business) {
this.business = business;
}
//...
}
在启动
中,向服务集合注册依赖项
public void ConfigureServices(IServiceCollection services) {
//...
services.AddScoped<BusinessManager>();
//...
}
public void配置服务(IServiceCollection服务){
//...
services.addScope();
//...
}
在正常流程中创建控制器时,将允许框架在运行时注入所需的依赖项,还允许控制器具有足够的灵活性,可以与模拟的业务实例隔离测试。它现在按预期工作。但是,这是正确的方法吗?因为假设我有10个BLL类,那么根据建议我需要添加10个AddScope方法。在某个地方我觉得这是不对的