Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重写代码以避免在单元测试期间调用外部dll_C#_Unit Testing_Architecture_Dllimport_Extern - Fatal编程技术网

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你的解决方案很好。