Издевательство над частным объектом - PullRequest
0 голосов
/ 04 августа 2020

Работаю над тестами в 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();

Для тестирования класса DeviceA я бы нравится издеваться над DeviceB(), чтобы изменить поведение deviceB.

Я считаю, что это должно быть возможно, но я не могу понять, как. Если у вас есть идеи или предложения, дайте мне знать. (Я предпочитаю использовать Nuget Moq vscode, но я открыт для альтернатив.)

1 Ответ

0 голосов
/ 04 августа 2020

У вас есть 2 варианта

Объявить virtual методы класса DeviceB и передать его на deviceA.

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.....
     }
}
...