2009-07-31 3 views
16

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

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

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

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

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

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

+1

Чтобы упредить ваш следующий вопрос - почему сборка тестирования должны быть подписаны, если тестируемый узел подписан? - вот моя статья на эту тему: http://blogs.msdn.com/ericlippert/archive/2009/06/04/alas-smith-and-jones.aspx –

ответ

28

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

Добавить

[assembly:InternalsVisibleTo("MyProjectTests")] 

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

+0

При наличии соответствующей ключевой ссылки с сильным именем, конечно же, - Вы сильно называете свои собрания, не так ли? –

3

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

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

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

+2

неточная ссылка исправить ошибку – Darcy

1

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

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

+0

Проблема в том, что они еще не существуют; и не будет на некоторое время. Это своего рода крупный проект (или он будет завершен). –

+0

Проблема с внутренним подходом заключается в том, что вы можете столкнуться с ситуацией, когда у вас есть внутренности. Но внешний API не подключается, как ожидалось, потому что в понимании есть разъединение. Обратная связь приходит намного позже .. когда это дороже исправить. – Gishu

+0

Правда, но откладывать тщательное тестирование до тех пор, пока приложение не будет выполнено, просто попрошайничает. Кроме того, внешний API, вероятно, будет принимать форму автоматизации действий пользователя и извлечения данных, а не расширения функциональности; его гораздо сложнее испортить по сравнению с полностью раздутым API-интерфейсом плагина. –

3

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

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

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

+0

ссылка не работает :( – User193452

0

Хотя [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