模拟私有对象

Mocking a Private Object

我正在使用 C# 进行测试。我正在尝试从引用中模拟一个函数(使用 Moq)。下面是所提供代码的简化版本。

B.cs:

public class DeviceB:
    public DeviceB():
        // do some stuff
        return something;

A.cs:

using B;
public class DeviceA:
    private static DeviceB deviceB;

    public DeviceA():
        deviceB = DeviceB();

为了测试 class DeviceA 我想模拟 DeviceB() 来改变 deviceB 的行为。

我相信这应该是可行的,但我不知道如何实现。如果您有任何想法或建议,请告诉我。 (我最好使用 Moq vscode nuget,但我愿意接受其他选择。)

你有2个选择

声明 DeviceB class 的 virtual 方法并将其传递给设备 A。

class DeviceB
{
    public virtual void method1()
    {
        // Code [..]
    }
}

class DeviceA
{
    private DeviceB _deviceb;

    public DeviceA(DeviceB deviceb)
    {
       _deviceb = deviceb;
    }

    // More code [..]
}

class UnitTest
{
    [Fact]
    public void TestMethod1()
    {
        // Arrange
        var mock = new Mock<DeviceB>();
        mock.Setup(..);

        // Act
        var devA = new DeviceA(mock.Object);
        var result = devA.mymethod();

        // Assert
        Assert.....
    }
}

为 DeviceB 方法声明接口(更好)并在 DeviceA 而不是 DeviceB 上使用它;将具体的 DeviceA 注入 DeviceB

interface IDeviceB
{
    void Method1();
    int AnotherMethod(int parm1);
}

class DeviceB : IDeviceB 
{
    // [..] Implementations
}


class DeviceA
{
    private IDeviceB _deviceB;

    public DeviceA(IDeviceB C)
    {
        _deviceB = deviceB;
    }
}

class UnitTest
{
     [Fact]
     public void TestMethod1()
     {
          // Arrange
          var mockedDeviceB = new Mock<IDeviceB>();
          mockedDeviceB.Setup(..);

          // Act
          var devA = new DeviceA(mockedDeviceB.Object);
          var result = devA.anotherMethod(1);

          // Assert
          Assert.....
     }
}