如何重写代码以避免在单元测试期间调用外部 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

你的故事并不完全清楚,但我认为你在问如何测试代码,而不必与实际的驱动程序 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(); }