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

Я бы хотел, чтобы моя сборка Core не открывала определенный класс, и я все равно хотел бы ее протестировать. Как я могу это сделать?

Ответ 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, вам не нужен действительно этот уровень скрытия.