FakeItEasy - Можно ли перехватить метод и заменить его собственной реализацией?
У меня есть следующий интерфейс:
public interface IOuputDestination
{
void Write(String s);
}
В моем модульном тесте я издеваюсь так:
var outputDestination = A.Fake<IOutputDestination>();
Я хочу перехватить метод Write, чтобы он использовал мою пользовательскую реализацию, которую я определил в своем тесте. Что-то вроде этого:
String output = "";
A.CallTo(() => outputDestination.Write(A<String>.Ignored)).Action(s => output += s);
//Is something like this even possible ? ----^
Здесь Action
Метод не существует, но я бы хотел, чтобы любой параметр передавался в outputDestination.Write
быть перенаправлены на мое пользовательское действие. Возможно ли это с помощью FakeItEasy? Если нет, есть ли другая насмешливая структура, которая допускает такое поведение?
2 ответа
Вы можете получить такое поведение с Invokes
:
String output = "";
A.CallTo(() => outputDestination.Write(A<String>.Ignored))
.Invokes((string s) => output += s);
Вы действительно не показываете, как вы используете outputDestination
как только вы создали это. Будете ли вы вводить его в тестируемый метод? Если так, то Что, если вместо создания подделки вы создадите специально созданный класс, который реализует IOutputDestination
и которая содержит требуемую реализацию Write()
?
Я предполагаю, что это будет зависеть от того, какие (если таковые имеются) другие действия, которые вы должны проверить на вашей подделке. Трудно понять без контекста.