Как разрешить сборку (единичное тестирование) для доступа к внутренним свойствам другой сборки?
Я бы хотел, чтобы моя сборка Core не открывала определенный класс, и я все равно хотел бы ее протестировать. Как я могу это сделать?
Ответы
Ответ 1
InternalsVisibleTo атрибут спасения!
Просто добавьте:
[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]
для ваших основных классов AssemblyInfo.cs файл
Подробнее см. Friend Assemblies (Руководство по программированию на С#).
Ответ 2
С InternalsVisible, если ваши сборки сильно пронумерованы, вам нужно указать открытый ключ (обратите внимание: полный ключ не токен открытого ключа), например...
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("BoardEx_BusinessObjects.Tests,
PublicKey=0024000004800000940000000602000000240000525341310004000001000100fb3a2d8 etc etc")]
и следующий трюк действительно полезен для получения открытого ключа, не прибегая к линии cmd...
http://www.andrewconnell.com/blog/archive/2006/09/15/4587.aspx
Ответ 3
Я поместил свои модульные тесты в ту же сборку, что и тестируемый код. Это имеет смысл для меня, потому что я думаю о "испытать себя" как о признаке класса, а также о таких вещах, как "инициализировать себя" и "описать себя".
Я слышал некоторые возражения против этого подхода, но некоторые из них были убедительными.
У меня болит производительность Ба, я говорю! Не оптимизируйте без жестких данных! Возможно, если вы планируете загружать свои сборки по медленным ссылкам, то сведение к минимуму размера сборки было бы целесообразным.
Это риск для безопасности. Только если у вас есть секреты в ваших тестах. Не делайте этого.
Теперь ваша ситуация отличается от моей, поэтому, возможно, это будет иметь смысл для вас, и, возможно, этого не произойдет. Вам придется это выяснить.
Кроме того: в С# я однажды попробовал поместить свои модульные тесты в класс с именем "Тесты", который был вложен внутри класса, который он тестировал. Это сделало правильную организацию вещей очевидной. Он также избегал дублирования имен, которые возникают, когда тесты для класса "Foo" находятся в классе под названием "FooTests". Тем не менее, рамки тестирования модулей, к которым у меня был доступ, отказались принять тесты, которые не были отмечены как "общедоступные". Это означает, что класс, который вы тестируете, не может быть "private". Я не могу придумать какой-либо веской причины требовать, чтобы тесты были "общедоступными", поскольку никто на самом деле не называет их публичными методами - все происходит через размышления. Если вы когда-либо пишете модульную структуру тестирования для .Net, пожалуйста, подумайте о том, чтобы разрешить непубличные тесты, ради меня!
Ответ 4
Вы можете использовать отражение (как это делают объекты MS Test), или вы можете объявить сборку unit test другом основной сборки.
Другой вариант - поставить модульные тесты в одну и ту же сборку.
Ответ 5
Я бы посоветовал не идти на такие неприятности... если вы действительно хотите unit test ваши "внутренние" классы, просто спрячьте их в пространстве имен, в котором будет использоваться только ваш внутренний код. Если вы не создаете фреймворк в масштабе платформы .NET, вам не нужен действительно этот уровень скрытия.