Как получить доступ к классам в другой сборке для целей модульного тестирования?
Я прыгаю в модульное тестирование в Visual-Studio 2008, и мне интересно, как лучше всего выполнить кросс-сборку class
доступ для тестирования.
По сути, у меня есть два проекта в одном решении:
- MyProject (C#)
- 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.
- Проверьте код проекта и закройте диалоговое окно.