Использование макетов объектов (Moq) с методами, которые используют отражение в C#? - PullRequest
1 голос
/ 27 февраля 2020

Таким образом, у меня есть случай использования, когда обобщенный метод c в базовом классе контроллера принимает набор служб и возвращает правильный (V1, V2 и т. Д. c) на основе URI или заголовка, который имеет номер версии. Здесь это ниже.

protected T GetService<T>(List<T> services)
        {
            return URI.Contains("v1") ? services.FirstOrDefault(x => x.GetType().ToString().Contains("1")) :
                                        services.FirstOrDefault(x => x.GetType().ToString().Contains(GetVersionFromHeader(WebContext)));
        }

Этот метод прекрасно работает на практике, потому что все наши сервисы имеют свой номер версии, добавленный к ним как [ServiceName] V1, [ServiceNameV2], et c.

Проблема теперь в том, что это нарушает множество существующих модульных тестов, потому что этот метод часто возвращает ноль, когда коллекция services является коллекцией поддельных интерфейсов, каждый из которых возвращает тип Castle.Proxies.ObjectProxy. Я действительно не могу провести эти изменения, если мне придется удалить четверть наших юнит-тестов. Я, вероятно, мог бы жестко закодировать условие, которое проверяет, является ли это тестом или нет, но я бы предпочел не совершать хакерское исправление, подобное этому.

Если у кого-то есть опыт или идеи по извлечению фактического макетированного типа или обходные пути от таких проблем, которые возникают из-за использования отражения и последующего тестирования этих методов с объектами Mocked, с благодарностью.

Спасибо!

...