Защищенный метод модульного тестирования в C # с использованием Moq

Недавно я обратил внимание на то, что вы можете модульно тестировать абстрактные базовые классы, используя Moq, вместо того, чтобы создавать в тесте фиктивный класс, реализующий абстрактный базовый класс. См. Как использовать moq для тестирования конкретного метода в абстрактном классе? Например, вы можете сделать:

public abstract class MyAbstractClass 
{
    public virtual void MyMethod()
    {
        // ...    
    }
}

[Test]
public void MyMethodTest()
{
    // Arrange            
    Mock mock = new Mock() { CallBase = true };

    // Act
    mock.Object.MyMethod();

    // Assert
    // ... 
}

Теперь мне было интересно, есть ли подобный метод, позволяющий тестировать защищенные члены без необходимости создавать класс-оболочку . Т.е. как вы протестируете этот метод:

public class MyClassWithProtectedMethod
{
    protected void MyProtectedMethod()
    {

    }
}

Я знаю пространство имен Moq.Protected, однако, насколько я могу судить, оно позволяет вам настраивать только ожидания, например,

mock.Protected().Setup("MyProtectedMethod").Verifiable();

Я также знаю, что очевидный ответ здесь - «не тестируйте защищенные методы, только тестируйте общедоступные методы», но это еще одна дискуссия! Я просто хочу знать, возможно ли это с помощью Moq.

Обновление: ниже показано, как я обычно это тестирую:

public class MyClassWithProtectedMethodTester : MyClassWithProtectedMethod
{
    public void MyProtectedMethod()
    {
        base.MyProtectedMethod();
    }
}

Заранее спасибо.

15
задан Community 23 May 2017 в 10:30
поделиться