Я хочу протестировать написанный мною код отражения.

Есть крайний случай, который произойдет, если сборки ReferencedAssemblies не будут загружены в AppDomain, т.е. если следующее выражение вернет true:

typeof(MyType).Assembly.GetReferencedAssemblies()
    .Except(AppDomain.CurrentDomain.GetAssemblies().Select(assem => assem.GetName()))
    .Any()

У меня 2 вопроса:

  1. Может ли это когда-либо вернуть true? (Я думаю, что "да" [и, следовательно, ответ на вопрос в заголовке - "нет"], хотя я не уверен).
  2. .
  3. Предположим, что может... тогда как я могу это оркестровать для целей модульного тестирования?

Ответы (1)

Как я и предполагал, это НЕ подмножество.

Вы можете столкнуться с ситуацией, когда ReferencedAssembly в настоящее время не загружена в AppDomain.CurrentDomain.

Для достижения этого в тесте:

  1. Создайте вторичный csproj. (ProjTwo)
  2. Создайте зависимость уровня csproj между вашим тестовым проектом и ProjTwo.
  3. Добавьте неиспользуемый класс, который ссылается на некоторый код в ProjTwo.
    • При необходимости добавьте статический класс со статическим методом no-op в ProjTwo, а второй статический класс, который просто вызывает этот метод, в ваш тестовый проект.
  4. Не ссылайтесь на сборку ProjTwo нигде в ваших TestFixtures.

Войла!


Шаг 4. означает, что ProjTwo не будет загружен, в то время как шаг 3. гарантирует, что компилятор не сможет удалить ссылку, поэтому она все равно появится в GetReferencedAssemblies(), избегая этой проблемы.

2022 WebDevInsider