Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在继承ControllerBase的控制器内声明构造函数_C#_Unit Testing_Asp.net Core_Asp.net Core 2.0_Mstest - Fatal编程技术网

C# 在继承ControllerBase的控制器内声明构造函数

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

我正在从事使用ASP.NETCore2.1的web应用程序项目。在开发API的同时,我们还尝试使用MSTest框架对其进行单元测试

我的控制器继承自
控制器库
。在我的测试台上,我正在使用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方法。在某个地方我觉得这是不对的