如何解决如何模拟 3rd 方库的工厂方法的返回类型?
我正在开发一种使用 Mono.Cecil 加载程序集的工具。我有以下工厂,它返回一个名为 binary 的对象,并依赖于负责使用 AssemblyDefinintion.ReadAssembly
方法加载程序集的接口。
我对单元测试完全陌生,我需要对 GetBinary
方法进行单元测试。
internal sealed class DotNetBinaryFactory : IBinaryFactory
{
private readonly IBinaryLoader binaryLoader;
public DotNetBinaryFactory(IBinaryLoader binaryLoader)
{
this.binaryLoader = binaryLoader;
}
[NotNull] public Binary GetBinary([NotNull] FilePath path)
{
var assembly = binaryLoader.LoadBinary(path);
return BinaryUtils.GetBinary(assembly);
}
}
这里是 IBinaryLoader
依赖实现
internal interface IBinaryLoader
{
AssemblyDefinition LoadBinary(FilePath path);
}
internal sealed class DotnetBinaryLoader : IBinaryLoader
{
public AssemblyDefinition LoadBinary([NotNull] FilePath path)
{
try
{
return AssemblyDefinition.ReadAssembly(path.Path);
}
catch (Exception)
{
Console.WriteLine("Exception in loading Assembly From : " + path.Path);
throw;
}
}
}
所以要对 GetBinary
方法进行单元测试,我需要模拟 IBinaryLoader
并设置 LoadBinary
方法以返回一个虚拟的 AssemblyDefinition
对象,但我无法创建一个。
这是我试过的
[Test]
public void GetDotnetBinary_AssemblyDefinitionInput_ReturnCorrectDotnetFrameworkBianry()
{
var path = FilePath.GetRandom();
var mockedAssemblyDef = new Mock<AssemblyDefinition>();
var binaryLoader = new Mock<IBinaryLoader>();
binaryLoader.Setup(m => m.LoadBinary(path)).Returns(mockedAssemblyDef.Object);
}
解决方法
您需要创建服务的模拟,而不是数据的模拟。在您的情况下,AssemblyDefinition
是数据,也是 sealed
。模拟并不适用于具体的数据类。您对“服务”binaryLoader
的模拟看起来不错。
您需要做的是以另一种方式创建您的虚拟 AssemblyDefinition
,然后返回它。我不熟悉 Mono.Cecil,但看起来您可以使用静态 Create() 方法。获得所需的实例后,其余的测试应该就位。
你最终会得到类似的东西
[Test]
public void GetDotnetBinary_AssemblyDefinitionInput_ReturnCorrectDotnetFrameworkBianry()
{
// arrange
var path = FilePath.GetRandom();
var assemblyDef = AssemblyDefinition.Create(...); // or however your create a real one
var binaryLoader = new Mock<IBinaryLoader>();
binaryLoader.Setup(m => m.LoadBinary(path)).Returns(assemblyDef);
var factory = new DotNetBinaryFactory(binaryLoader);
// act
var result = factory.GetBinary(path);
// assert
// your assertions here...
}
我也看到你的类型是内部的。假设您的测试在不同的程序集中,您必须使该程序集中的内部结构可见。这是通过在源程序集中放置一个 [InternalsVisibleTo] 属性来完成的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。