Как получить доступ к классам в другой сборке для целей модульного тестирования? - PullRequest
19 голосов
/ 31 июля 2009

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

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

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

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

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

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

Ответы [ 6 ]

34 голосов
/ 31 июля 2009

Для этого можно использовать атрибут уровня сборки InternalsVisibleToAttribute .

Добавить

[assembly:InternalsVisibleTo("MyProjectTests")]

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

3 голосов
/ 31 июля 2009

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

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

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

3 голосов
/ 31 июля 2009

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

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

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

1 голос
/ 22 марта 2018

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

Резюме:

  • В вашем модульном тестовом проекте добавьте ссылку на тестируемый код. Вот как создать ссылку на проект кода в том же решении:
  • Выберите проект в обозревателе решений.
  • В меню Проект выберите Добавить ссылку ...
  • В диалоговом окне «Диспетчер ссылок» откройте узел «Решение» и выберите «Проекты».
  • Проверьте код проекта и закройте диалоговое окно.
1 голос
/ 07 ноября 2013

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

  • При использовании Отражение

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

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

1 голос
/ 31 июля 2009

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

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

...