c # Массив ссылок на делегатов - PullRequest
0 голосов
/ 12 апреля 2011

При обращении к другим классам мы используем делегаты.Во время модульного тестирования мы переопределяем эти значения.

У меня есть класс, который ссылается на более чем 20 других классов, поэтому я подумал, что создам массив делегатов.Если я создаю статический массив этих делегатов (см. Код ниже), он хранит значения делегатов, а не ссылку на делегата.

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

private static Func<int, bool> firstMethod = ExternalClass1.Method;
private static Func<int, bool> secondMethod = ExternalClass2.Method;
private static Func<int, bool> thirdMethod = ExternalClass3.Method;

private static Func<int, bool>[] handlers = { first, second, third };

public bool Test(int value)
{
    foreach (var handler in handlers)
    {
        if (handler.Invoke(value) == true)
        {
             return true;
        }
    }

    return false;
}

1 Ответ

2 голосов
/ 12 апреля 2011

Вместо создания этого массива обработчиков, вы можете сделать что-то вроде этого:

private static IEnumerable<Func<int,bool>> GetHandlers()
{
    yield return firstMethod;
    yield return secondMethod;
    yield return thirdMethod;
}

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

* 1006 Дан *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...