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

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

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

  • MyProject (С#)
  • MyProjectTests (проект тестирования С#)

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

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

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

Ответ 1

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

Добавить

[assembly:InternalsVisibleTo("MyProjectTests")]

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

  • Используя Отражение

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

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

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