Почему для имитации репозитория требуется виртуальная функция, а фиксация IRepository переопределяет существующую функцию?

Я провожу модульное тестирование с использованием фреймворка NUnit и Moq. Когда я пытаюсь имитировать IRepository с помощью mockRepo.Setup (x = ›x.GetStr (It.IsAny) ()). Returns (str), тогда метод, который должен быть протестирован, переопределяется внутри класса Repository, и сборка завершается ошибкой. Но вместо того, чтобы издеваться над IRepository, если я издеваюсь над репозиторием, создавая метод, который должен быть протестирован как виртуальный, тогда данные будут издеваться, и тест будет запущен.


person Krits    schedule 29.09.2020    source источник
comment
Методы интерфейса неявно виртуальны в том смысле, что невозможно указать реализацию. Если метод класса не виртуальный, подкласс не может заменить реализацию.   -  person Jeremy Lakeman    schedule 29.09.2020
comment
Почему вы издеваетесь над тестируемым методом? Вы должны имитировать зависимости, а не свою тестируемую систему.   -  person HimBromBeere    schedule 29.09.2020
comment
@HimBromBeere большое спасибо, я пробую это сейчас и в значительной степени преуспеваю.   -  person Krits    schedule 30.09.2020


Ответы (1)


Любые насмешки полагаются на то, что члены должны быть переопределены. Ваша mocking-framework создаст некоторый класс, который либо реализует ваш интерфейс, либо переопределяет ваш класс. Итак, то, что создает фреймворк, похоже на следующее:

class WeirdClassName : IRepository
{
    string GetString(object o) => "SomeString";
}

или если ваш член будет членом класса, это:

class WeirdClassName : Repository
{
    string override GetString(object o) => "SomeString";
}

Члены интерфейса неявно переопределяемы, поскольку они буквально не предоставляют никакой собственной логики. Вы всегда можете предоставить для него свою собственную реализацию. Члены класса могут быть заменены, только если они virtual.

В вашем случае кажется, что в тесте есть некоторая разница в зависимости от того, издеваете ли вы интерфейс или класс. Это, вероятно, указывает на то, что ваш тест зависит от некоторых внутренних компонентов класса - например, некоторая инициализация на репо. Вы должны либо поиздеваться над этим, либо отделить свой тест от этой зависимости.

person HimBromBeere    schedule 29.09.2020
comment
Спасибо @HimBromBeere за решение. Я сейчас ищу насмешку над зависимостью. И это работает. - person Krits; 30.09.2020