编写单元测试时无法实例化 class 错误的代理
Can not instantiate proxy of class error when writing unit test
我有以下 类:
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>();
}
作为我的单元测试的起点,我只想构建这个 class/check 它可以被构建。我尝试了以下方法:
[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# 单元测试或最小起订量方面没有太多经验,因此如有任何建议,我们将不胜感激。谢谢!
根据您为 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 的基础 class 看起来像这样吗:
public class ExtractFileHandler<T>
{
public ExtractFileHandler(
IRecordParser recordParser,
IUnzipper unzipper,
IFileStore fileStore,
ILocationService locationService)
{
// ...
}
}
但是在单元测试中你模拟了 class ExtractFileHandler 所以我想你的代码中有这样的东西:
public class ExtractFileHandler<T> : ExtractFileHandler
{
}
并且从 UkExtractFileHandler class 可以明显看出 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:
的异常
Can not instantiate proxy of class ... Could not find a constructor
that would match given arguments
我有以下 类:
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>();
}
作为我的单元测试的起点,我只想构建这个 class/check 它可以被构建。我尝试了以下方法:
[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# 单元测试或最小起订量方面没有太多经验,因此如有任何建议,我们将不胜感激。谢谢!
根据您为 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 的基础 class 看起来像这样吗:
public class ExtractFileHandler<T>
{
public ExtractFileHandler(
IRecordParser recordParser,
IUnzipper unzipper,
IFileStore fileStore,
ILocationService locationService)
{
// ...
}
}
但是在单元测试中你模拟了 class ExtractFileHandler 所以我想你的代码中有这样的东西:
public class ExtractFileHandler<T> : ExtractFileHandler
{
}
并且从 UkExtractFileHandler class 可以明显看出 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:
的异常Can not instantiate proxy of class ... Could not find a constructor that would match given arguments