Как получить доступ к классам в другой сборке для целей модульного тестирования?

Я прыгаю в модульное тестирование в Visual-Studio 2008, и мне интересно, как лучше всего выполнить кросс-сборку class доступ для тестирования.

По сути, у меня есть два проекта в одном решении:

  1. MyProject (C#)
  2. MyProjectTests (тестовый проект C#)

Все в MyProject в настоящее время имеет доступность по умолчанию, что, если я правильно помню, означает, что все эффективно internal, Я в основном хочу проверить на class уровень, но есть несколько delegates участвует.

Вероятно, когда-нибудь в будущем появится внешний API, но я нахожусь на 20% пути к полной функциональности (по крайней мере, на бумаге), и я получаю довольно опасное наложение большего количества кода поверх этого непроверенного ядра. Соответственно, я хотел бы завершить некоторое тестирование сейчас, до того, как приложение будет достаточно полно для традиционного (читай: плохого и / или ленивого) функционального тестирования, и определенно до того, как внешний API версии n + 1 будет запущен.

В дополнение к прямому ответу, пример решения был бы очень признателен.

6 ответов

Решение

Вы можете использовать атрибут уровня сборки InternalsVisibleToAttribute для достижения этой цели.

добавлять

[assembly:InternalsVisibleTo("MyProjectTests")]

в AssemblyInfo.cs в вашей сборке MyProject.

Вам нужно добавить

[assembly:InternalsVisibleTo("Unit.Tests.Assembly")] 

в AssemblyInfo.cs вашего "MyProject (C#)". Это позволит вашим тестам получить доступ к внутренним методам тестирования.

Вы можете протестировать внутренние методы, добавив атрибут в AssemblyInfo.cs для вашего основного проекта, предоставив доступ к внутренним методам для именованной сборки:

[Сборка:InternalsVisibleTo("MyProjectTestsNameSpace.MyProjectTests")]

Дальнейшая информация здесь

Похоже, вам нужен InternalsVisibleToAttribute

Однако я бы рекомендовал против такого подхода - протестировать свои внутренние классы через открытый интерфейс или API.

Хотя [InternalsVisibleTo] Это самый разумный способ ИМО, есть как минимум 2 других способа сделать это:

  • Используя Reflection

     var method = instance.GetType().GetMethod(
        methodName, BindingFlags.NonPublic | BindingFlags.Instance, 
        null, paramTypeArray, null);
     return method.Invoke(instance, parameters);
    

Проблема с этим подходом состоит в том, что если имя метода или сигнатура изменятся, модульный тест не будет выполнен во время выполнения, тогда как [InternalsVisibleTo] было бы легко подхватить это критическое изменение во время компиляции.

  • Используйте рамки тестирования, такие как Moles / Fakes или же TypeMock

Я нашел это https://msdn.microsoft.com/en-us/library/hh598957.aspx Надеюсь, что это может кому-то помочь.

Резюме:

  • В своем проекте модульного тестирования добавьте ссылку на тестируемый код. Вот как создать ссылку на проект кода в том же решении:
  • Выберите проект в обозревателе решений.
  • В меню Проект выберите Добавить ссылку....
  • В диалоговом окне Reference Manager откройте узел Solution и выберите Projects.
  • Проверьте код проекта и закройте диалоговое окно.
Другие вопросы по тегам