首页 > 解决方案 > 编写单元测试时无法实例化类错误代理

问题描述

我有以下课程:

   public ExtractUkFileFunction (UkExtractFileHandler fileHandler)
        {
            _fileHandler = fileHandler;
        }

public class UkExtractFileHandler : ExtractFileHandler<UkExtractFileHandler.FileMapper>
{
    public UkExtractFileHandler(ILoggerFactory loggerFactory, IRecordParser recordParser, IUnzipper unzipper, IFileStore fileStore, ILocationService locationService) 
        : base(recordParser, unzipper, fileStore, locationService)
    {
        Logger = loggerFactory.Create<ExtractFileHandler>();
    }

作为我的单元测试的起点,我只想构建这个类/检查它是否可以构建。我尝试了以下方法:

 [Test]
    public void Construct_ExtractUkFileFunction_ExpectSuccess()
    {
        var mockLoggerFactory = new Mock<ILoggerFactory>();
        var mockRecordParser = new Mock<IRecordParser>();
        var mockUnzipper = new Mock<IUnzipper>();
        var mockFileStore = new Mock<IFileStore>();
        var mockLocationService = new Mock<ILocationService>();
        
        var mockFileHandler = new Mock<ExtractFileHandler>
            (mockLoggerFactory.Object, mockRecordParser.Object, mockUnzipper.Object, mockFileStore.Object, mockLocationService.Object);
        var extractUkFileFunction = new ExtractUkFileFunction(mockFileHandler.Object);

        Assert.IsNotNull(extractUkFileFunction ); 
    }

但是我收到错误:

Can not instantiate proxy of class: Core.Handlers.UkExtractFileHandler.
    Could not find a constructor that would match given arguments:
    Castle.Proxies.ILoggerFactoryProxy
    Castle.Proxies.IRecordParserProxy
    Castle.Proxies.IUnzipperProxy
    Castle.Proxies.IFileStoreProxy
    Castle.Proxies.ILocationServiceProxy

我在 C# 单元测试或起订量方面没有很多经验,所以任何建议都将不胜感激。谢谢!

标签: c#unit-testingmoq

解决方案


根据您为 UkExtractFileHandler 提供的代码:

public class UkExtractFileHandler : ExtractFileHandler<UkExtractFileHandler.FileMapper>
{
    public UkExtractFileHandler(
          ILoggerFactory loggerFactory, 
          IRecordParser recordParser, 
          IUnzipper unzipper, 
          IFileStore fileStore, 
          ILocationService locationService) 
        : base(recordParser, unzipper, fileStore, locationService)
    {
        Logger = loggerFactory.Create<ExtractFileHandler>();
    }
}

UkExtractFileHandler 的基类会不会像这样:

    public class ExtractFileHandler<T>
    {
        public ExtractFileHandler(
            IRecordParser recordParser, 
            IUnzipper unzipper, 
            IFileStore fileStore, 
            ILocationService locationService)                 
        {
            // ...
        }
    }

但是在单元测试中,你模拟了 ExtractFileHandler 类,所以我想你的代码中有这样的东西:

public class ExtractFileHandler<T> : ExtractFileHandler
{

}

从 UkExtractFileHandler 类可以明显看出,ExtractFileHandler 有一个这样的构造函数,带有 4 个参数

public class ExtractFileHandler
{
    public ExtractFileHandler(
        IRecordParser recordParser, 
        IUnzipper unzipper, 
        IFileStore fileStore, 
        ILocationService locationService)
    {
        // ...
    }
}

因此,您的问题可能出在此代码中,您将不是 4 个而是 5 个参数传递给 ExtractFileHandler 的构造函数,该构造函数只需要 4 个参数

var mockFileHandler = new Mock<ExtractFileHandler>(
   mockLoggerFactory.Object, <- this par. probably doesn't match the constructor signature 
   mockRecordParser.Object, 
   mockUnzipper.Object, 
   mockFileStore.Object, 
   mockLocationService.Object);

当在 Mock 中使用的参数数量不匹配时,您将收到 Castle.DynamicProxy.InvalidProxyConstructorArgumentsException 类型的异常:

无法实例化类的代理...找不到与给定参数匹配的构造函数


推荐阅读