Я провожу модульное тестирование с использованием фреймворка NUnit и Moq. Когда я пытаюсь имитировать IRepository с помощью mockRepo.Setup (x = ›x.GetStr (It.IsAny) ()). Returns (str), тогда метод, который должен быть протестирован, переопределяется внутри класса Repository, и сборка завершается ошибкой. Но вместо того, чтобы издеваться над IRepository, если я издеваюсь над репозиторием, создавая метод, который должен быть протестирован как виртуальный, тогда данные будут издеваться, и тест будет запущен.
Почему для имитации репозитория требуется виртуальная функция, а фиксация IRepository переопределяет существующую функцию?
Ответы (1)
Любые насмешки полагаются на то, что члены должны быть переопределены. Ваша mocking-framework создаст некоторый класс, который либо реализует ваш интерфейс, либо переопределяет ваш класс. Итак, то, что создает фреймворк, похоже на следующее:
class WeirdClassName : IRepository
{
string GetString(object o) => "SomeString";
}
или если ваш член будет членом класса, это:
class WeirdClassName : Repository
{
string override GetString(object o) => "SomeString";
}
Члены интерфейса неявно переопределяемы, поскольку они буквально не предоставляют никакой собственной логики. Вы всегда можете предоставить для него свою собственную реализацию. Члены класса могут быть заменены, только если они virtual
.
В вашем случае кажется, что в тесте есть некоторая разница в зависимости от того, издеваете ли вы интерфейс или класс. Это, вероятно, указывает на то, что ваш тест зависит от некоторых внутренних компонентов класса - например, некоторая инициализация на репо. Вы должны либо поиздеваться над этим, либо отделить свой тест от этой зависимости.