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()?

Я предполагаю, что это будет зависеть от того, какие (если таковые имеются) другие действия, которые вы должны проверить на вашей подделке. Трудно понять без контекста.

Другие вопросы по тегам