如何重写代码以避免在单元测试期间调用外部 dll
本文关键字:单元测试 调用 dll 外部 何重写 重写 代码 | 更新日期: 2023-09-27 18:35:31
有类Driver,它在构造函数中调用静态extern方法。这是更改体系结构以便能够单元测试驱动程序方法的最佳方法。
public class Driver
{
[DllImport("Driver.dll")]
private static extern IntPtr CreateDriver();
// Pointer to C++ Driver object
internal IntPtr DriverPtr; // this for integration tests
public Driver()
{
DriverPtr = CreateDriver();
}
public int SomeMethod(int a) // test only this method
{
return a + 1;
}
}
你的故事并不完全清楚,但我认为你在问如何测试代码,而不必与实际的驱动程序 DLL 接口。目前尚不清楚是否要在构造函数中使用分配给DriverPtr
的值。
您可以通过将静态方法移动到实例类中、连接该类并在测试期间模拟它来解决此问题。
界面:
public interface IDriverProvider
{
IntPtr Create();
}
实现:
public class DriverProvider : IDriverProvider
{
[DllImport("Driver.dll")]
private static extern IntPtr CreateDriver();
public IntPtr Create()
{
return CreateDriver();
}
}
然后将其注入到您的 using 类中:
public class Driver
{
internal IntPtr DriverPtr;
public Driver(IDriverProvider driverProvider)
{
DriverPtr = driverProvider.Create();
}
public int SomeMethod(int a) // test this method
{
return a + 1;
}
}
现在,您可以测试您的类:
// Arrange
var driverProviderMock = new Mock<IDriverProvider>();
var driver = new Driver(driverProviderMock.Object);
// Act
driver.SomeMethod();
// Assert
driverProviderMock.Verify(d => d.Create());
有很多方法,这取决于你想做什么。
例如,您可以使用额外的参数创建一个虚拟构造函数,并且不执行调用:
public Driver(bool dummy){ }
或者更改构造函数以执行注释,然后有一个 Init() 函数:
public Driver(){ } //Can be removed, left for example clarity
public void Init(){ DriverPtr = CreateDriver(); }