Для начала, нет смысла в модульном тестировании абстрактного метода.Там нет реализации!Возможно, вы захотите выполнить модульное тестирование нечистого абстрактного класса, убедившись, что абстрактный метод был вызван:
[Test]
public void Do_WhenCalled_CallsMyAbstractMethod()
{
var sutMock = new Mock<MyAbstractClass>() { CallBase = true };
sutMock.Object.Do();
sutMock.Verify(x => x.MyAbstractMethod());
}
public abstract class MyAbstractClass
{
public void Do()
{
MyAbstractMethod();
}
public abstract void MyAbstractMethod();
}
Обратите внимание, что я установил CallBase, чтобы превратить это в частичное макетирование, если Do был виртуальным.В противном случае Moq заменил бы реализацию метода Do.
Используя Protected (), вы можете убедиться, что защищенный метод был вызван аналогичным образом.
Когда вы создаете макет с помощью Moq илидругая библиотека, весь смысл переопределения реализации.Тестирование защищенного метода включает в себя выявление существующей реализации.Это не то, для чего предназначен Moq.Protected () просто дает вам доступ (предположительно через отражение, поскольку он основан на строках) для переопределения защищенных членов.
Либо напишите тестовый класс-потомок с методом, который вызывает ваш защищенный метод, либо используйте отражение в модулетест для вызова защищенного метода.
Или, что еще лучше, не тестируйте защищенные методы напрямую.