C# 如何重写代码以避免在单元测试期间调用外部dll
有一个类驱动程序,它在构造函数中调用静态外部方法。哪种方法是改变体系结构以能够单元测试驱动程序方法的最佳方法C# 如何重写代码以避免在单元测试期间调用外部dll,c#,unit-testing,architecture,dllimport,extern,C#,Unit Testing,Architecture,Dllimport,Extern,有一个类驱动程序,它在构造函数中调用静态外部方法。哪种方法是改变体系结构以能够单元测试驱动程序方法的最佳方法 public class Driver { [DllImport("Driver.dll")] private static extern IntPtr CreateDriver(); // Pointer to C++ Driver object internal IntPtr DriverPtr; // this for integration te
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;
}
}
有很多方法,这取决于你想做什么 例如,您可以使用一个额外的参数创建一个伪构造函数,而不进行调用:
public Driver(bool dummy){ }
或者将构造函数更改为nothing,然后使用Init()函数:
public Driver(){ } //Can be removed, left for example clarity
public void Init(){ DriverPtr = CreateDriver(); }
有很多方法,这取决于你想做什么 例如,您可以使用一个额外的参数创建一个伪构造函数,而不进行调用:
public Driver(bool dummy){ }
或者将构造函数更改为nothing,然后使用Init()函数:
public Driver(){ } //Can be removed, left for example clarity
public void Init(){ DriverPtr = CreateDriver(); }
您的故事并不完全清楚,但我想您是在问如何在不必与实际驱动程序DLL接口的情况下测试代码。尚不清楚是否要在构造函数中使用分配给
drivertr
的值
您可以通过将静态方法移动到实例类中、连接该类并在测试期间模拟它来修复此问题
界面:
public interface IDriverProvider
{
IntPtr Create();
}
实施:
public class DriverProvider : IDriverProvider
{
[DllImport("Driver.dll")]
private static extern IntPtr CreateDriver();
public IntPtr Create()
{
return CreateDriver();
}
}
然后将其注入到您的使用类中:
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());
//排列
var driverProviderMock=new Mock();
var driver=新驱动程序(driverProviderMock.Object);
//表演
driver.SomeMethod();
//断言
验证(d=>d.Create());
您的故事并不完全清楚,但我想您是在问如何在不必与实际驱动程序DLL接口的情况下测试代码。尚不清楚是否要在构造函数中使用分配给drivertr
的值
您可以通过将静态方法移动到实例类中、连接该类并在测试期间模拟它来修复此问题
界面:
public interface IDriverProvider
{
IntPtr Create();
}
实施:
public class DriverProvider : IDriverProvider
{
[DllImport("Driver.dll")]
private static extern IntPtr CreateDriver();
public IntPtr Create()
{
return CreateDriver();
}
}
然后将其注入到您的使用类中:
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());
//排列
var driverProviderMock=new Mock();
var driver=新驱动程序(driverProviderMock.Object);
//表演
driver.SomeMethod();
//断言
验证(d=>d.Create());
在您的Driver
课程中,如何使用driverprtr
?在你的例子中,你什么都不做,只是创造它。实际上,这并不重要。其思想是使用单元测试来测试SomeMethod()。单元测试无法调用dll。如何处理驱动程序
类中的驱动程序rptr
?在你的例子中,你什么都不做,只是创造它。实际上,这并不重要。其思想是使用单元测试来测试SomeMethod()。单元测试无法调用dll。“可以创建一个带有额外参数的虚拟构造函数”-只是为了能够对其进行单元测试?不要。“然后有一个Init()函数”-然后呢?当类不用于测试时调用Init。我不是OP,但他们显然想访问某个地方的drivertr
。如果他想使用它,那么无论如何都必须调用DLL,因此这个问题没有意义,看看他发布的函数示例,不引用指针。如果可以使用继承的类,则不需要init方法,保持类的原样并创建一个新类,只使用空构造函数,这样原始构造函数将不会执行。“可以创建一个带有额外参数的伪构造函数”-只是为了能够对其进行单元测试?不要。“然后有一个Init()函数”-然后呢?当类不用于测试时调用Init。我不是OP,但他们显然想访问某个地方的drivertr
。如果他想使用它,那么无论如何都必须调用DLL,因此这个问题没有意义,看看他发布的函数示例,不引用指针。如果可以使用继承的类,则不需要init方法,保持类不变,创建一个新类,只使用空构造函数,这样就不会执行原始构造函数。我只编写了相同的代码,并将其称为IDriveProvider。该死的。:)@Malmi给事情命名很难,但我不想花太长时间我的答案被否决了,因为它是不正确的,或者因为有人不知道他们错了?这正是解决方案。谢谢@很抱歉,删除了我的评论。我想错人了P您的解决方案很好。我刚刚编写了相同的代码,并将其称为IDriveProvider。该死的。:)@Malmi给事情命名很难,但我不想花太长时间我的答案被否决了,因为它是不正确的,或者因为有人不知道他们错了?这正是解决方案。谢谢@很抱歉,删除了我的评论。我想错人了P你的解决方案很好。