Атрибут "InternalsVisibleTo" є ключовим для будь-якого тестування "білого поля" (термін десятиліття, я думаю) для .Net. Його можна розмістити у будь-якому файлі c # з атрибутом "збирання" на передній панелі. Зауважте, що MS DOC кажуть, що ім'я складання повинно кваліфікуватися за допомогою маркера відкритого ключа, якщо він підписаний. Іноді це не працює, і потрібно використовувати повний відкритий ключ на своєму місці. Доступ до внутрішніх справ є ключовим для тестування паралельних систем та у багатьох інших ситуаціях. Дивіться https://www.amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054 . У цій книзі Месзарос описує різноманітні стилі кодування, які в основному складають підхід "Design For Test" до розробки програми. Принаймні, так я використовував її протягом багатьох років.
ДОБАВЛЕНО: Вибачте, я не був тут деякий час. Один із підходів називає підхід "тестування підкласу" Медзаросом. Знову ж таки, потрібно використовувати "Internalsvisableto" для доступу до внутрішніх даних базового класу. Це чудове рішення, але воно не працює для закритих класів. Коли я викладаю "Дизайн для тесту", я припускаю, що це одна з речей, яку потрібно зробити заздалегідь розробленими в базові класи, щоб забезпечити перевірку. Це має стати майже культурною річчю. Сконструюйте базовий клас, який не є герметичним. Назвіть це UnsealedBaseClass або щось рівнозначне. Це клас, який слід підкласифікувати для тестування. Крім того, підклас складається для виготовлення виготовленого герметичного класу, який часто відрізняється лише конструкторами, які він виставляє. Я працюю в ядерній промисловості, і вимоги до випробувань дуже серйозно сприймаються. Отже, я повинен постійно думати про ці речі. До речі, залишення тестових гаків у виробничому коді не вважається проблемою в нашій галузі, якщо вони є "внутрішніми" в реалізації .Net. Наслідки НЕ тестування чогось можуть бути досить глибокими.