Как получить доступ к классам в другой сборке для целей модульного тестирования?
-
06-07-2019 - |
Вопрос
Я перехожу к модульному тестированию способом Visual-Studio 2008, и мне интересно, какой наилучший способ выполнить перекрестную сборку class
доступ для целей тестирования.
По сути, у меня есть два проекта в одном решении:
- MyProject (C #)
- MyProjectTests (тестовый проект на C #)
Все в MyProject в настоящее время имеет доступность по умолчанию, что, если я правильно помню, означает, что все эффективно internal
.В основном я собираюсь протестироваться в class
уровне, но есть несколько delegates
вовлечен.
Вероятно, когда-нибудь в будущем появится внешний API, но я прошел около 20% пути к завершению функции (по крайней мере, на бумаге), и я начинаю опасаться накладывать больше кода поверх этого непроверенного ядра.Соответственно, я хотел бы провести некоторое тестирование сейчас, прежде чем приложение станет достаточно полным для традиционного (читать:плохое и / или ленивое) функциональное тестирование и определенно до запуска версии n + 1 внешнего API.
В дополнение к прямому ответу, я был бы весьма признателен за пример решения.
Решение
Вы можете использовать атрибут уровня сборки InternalsVisibleToAttribute а> чтобы достичь этого.
Добавить
[assembly:InternalsVisibleTo("MyProjectTests")]
в AssemblyInfo.cs в вашей сборке MyProject.
Другие советы
Вы можете протестировать внутренние методы, добавив атрибут в AssemblyInfo.cs для вашего основного проекта, предоставляющий доступ к внутренним методам именованной сборки:
[сборка:InternalsVisibleTo("MyProjectTestsNameSpace.MyProjectTests")]
Дополнительная информация приведена ниже здесь
Вам нужно добавить
[assembly:InternalsVisibleTo("Unit.Tests.Assembly")]
в AssemblyInfo.cs вашего " MyProject (C #) " ;. Это позволит вашим тестам получить доступ к внутренним методам тестирования.
Похоже, вам нужен InternalsVisibleToAttribute р>
Однако я бы рекомендовал против такого подхода - протестировать свои внутренние классы через открытый интерфейс или API.
Хотя [InternalsVisibleTo]
это наиболее разумный способ, ИМО, есть по крайней мере 2 других способа сделать это:
Используя Отражение
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 Надеюсь, это кому-нибудь поможет.
Краткие сведения:
- В вашем проекте модульного тестирования добавьте ссылку на тестируемый код.Вот как создать ссылку на проект кода в том же решении:
- Выберите проект в Обозревателе решений.
- В меню Проект выберите Добавить ссылку....
- В диалоговом окне Диспетчер ссылок откройте узел Решение и выберите Проекты.
- Проверьте название проекта code и закройте диалоговое окно.