C# UnitTest类中的IOC-Unity.WebApi

C# UnitTest类中的IOC-Unity.WebApi,c#,unit-testing,asp.net-web-api,inversion-of-control,C#,Unit Testing,Asp.net Web Api,Inversion Of Control,我已经成功地在web api项目中实现了Unity.WebAPI。有一些消息表明MService类的新实例没有被创建。当我运行单元测试方法时,我收到以下错误消息 无法获取类MServiceTests的默认构造函数 服务等级 private readonly IRepository _mRepository; public MService(IMRepository mRepository) { _mRepository = mRepository;

我已经成功地在web api项目中实现了Unity.WebAPI。有一些消息表明MService类的新实例没有被创建。当我运行单元测试方法时,我收到以下错误消息

无法获取类MServiceTests的默认构造函数

服务等级

    private readonly IRepository _mRepository;

    public MService(IMRepository mRepository)
    {
        _mRepository = mRepository;
    }

     public List<FUser> GetFUser()
    {
      result = _mRepository.ExecuteCommandReader()
    }
 public class MServiceTests
{
    private readonly IMRepository _mRepository;
    private readonly IMService _mService;


    public MServiceTests(IMRepository mRepository, IMService mService)
    {
        _mRepository = mRepository;
        _mService = mService;
    }




    [TestMethod]
    public void Get_Users_ReturnsUserList()
    {

        var resultList = new List<FUser>();
        resultList = _mService.GetFUser();

        Assert.IsTrue(resultList.Count > 0);

    }
}
private readonly IRepository\u mRepository;
公共MService(IMRepository mRepository)
{
_mRepository=mRepository;
}
公共列表GetFUser()
{
结果=\u mRepository.ExecuteCommandReader()
}
测试类

    private readonly IRepository _mRepository;

    public MService(IMRepository mRepository)
    {
        _mRepository = mRepository;
    }

     public List<FUser> GetFUser()
    {
      result = _mRepository.ExecuteCommandReader()
    }
 public class MServiceTests
{
    private readonly IMRepository _mRepository;
    private readonly IMService _mService;


    public MServiceTests(IMRepository mRepository, IMService mService)
    {
        _mRepository = mRepository;
        _mService = mService;
    }




    [TestMethod]
    public void Get_Users_ReturnsUserList()
    {

        var resultList = new List<FUser>();
        resultList = _mService.GetFUser();

        Assert.IsTrue(resultList.Count > 0);

    }
}
公共类MServiceTests
{
私有只读IMRepository\u mRepository;
私有只读IMService(imu mService);
公共MServiceTests(IMRepository mRepository、IMService mService)
{
_mRepository=mRepository;
_mService=mService;
}
[测试方法]
public void Get\u Users\u ReturnsUserList()
{
var resultList=新列表();
结果列表=_mService.GetFUser();
Assert.IsTrue(resultList.Count>0);
}
}
UnityConfig

    container.RegisterType<IFService, FService>(new HierarchicalLifetimeManager());
    container.RegisterType<IMService, MService>(new HierarchicalLifetimeManager());
    container.RegisterType<ITransactionService, TransactionService>(new HierarchicalLifetimeManager());
    container.RegisterType<IMRepository, MRepository>();
container.RegisterType(新的层次结构CallifetimeManager());
RegisterType(新的层次结构CallifetimeManager());
RegisterType(新的层次结构CallifetimeManager());
container.RegisterType();

您缺少测试类上的[TestClass]属性(假设您使用的是MSTest框架)。 测试类需要有一个空的默认构造函数,或者根本没有构造函数

对于设置测试,您可以按照以下方式进行安排:

  • 手动创建所需的实例或
  • 使用模拟框架或
  • 执行与应用程序中有关依赖项注入相同的初始化,然后根据需要解析实例
  • 也许您还想看看单元测试的Arrange-Act-Assert模式: (见附件)


    还请记住,您更希望测试代码,而不是DI框架。

    对于如何对具有依赖性的类进行单元测试,似乎有点困惑

    让我们假设被测对象是这样的

    public class MService: IMService {
    
        private readonly IMRepository mRepository;
    
        public MService(IMRepository mRepository) {
            this.mRepository = mRepository;
        }
    
        public List<FUser> GetFUser() {
            var result = mRepository.ExecuteCommandReader();
            return result
        }
    }
    
    最初出现问题的原因是测试运行程序无法创建测试类,因为它(运行程序)不是为执行DI而构建的

    为了测试subject类,您需要创建该类的实例,并注入测试被测方法行为所需的任何依赖项


    真的没有必要使用容器进行如此小的独立测试

    你说的“它不工作”是什么意思?我已经更新了问题,错误发生的时间和方式是什么?我需要注册MServiceTests类类型吗?从容器中解决的任何问题都必须首先注册。对问题的良好解释和可行的解决方案。