Jó ötlet és helyes dolog, ha a unit testek egy (vagy esetleg több) külön projektbe kerülnek, ezzel szeparálva az éles kódtól. Másfelől nézve viszont egy külső projektből hivatkozva alapjáraton csak a publikus dolgokat tudjuk elérni, így könnyen támadhatna az az ötlet (hibásan), hogy fájó szívvel megszegjük elveinket és publikussá tegyünk bizonyos belső adatszerkezeteket, metódusokat, változókat pusztán azért, hogy tesztelhessük azokat.
A .NET C#-ban a láthatósági szintek között szerepel egy olyan, hogy internal, ami azt jelenti, hogy csak az adott assembly-n belül lehetséges hivatkozni rá, csak azon belül látható. Amennyiben mégis megpróbálnánk kívülről elérni (például egy szeparált unit test projektből), akkor fordítási idejű hibát dobna, mondván, hogy nem fér hozzá.
Rossz megoldás: mindent publikussá
Egyik lehetséges megoldás erre, hogy ha a kérdéses osztályt, metódust, stb., publikussá tesszük. Ez maximum csak első látszatra tűnhet megoldásnak, mivel hamar előjön, hogy szinte mindent publikussá kéne tennünk, amivel pedig éppen csak az osztály egyik célját, a hozzáférés-szabályozást veszítjük el. Létezik ennél egy hatékonyabb megoldás is.
Helyes megoldás: assembly-k összebarátkoztatása (Friend Assemblies)
Egy barátnak jelölt assembly ugyanúgy hozzá tud férni egy másik assembly-ben lévő internal típusaihoz és egyéb tagjaihoz, mintha azok publikusak lennének. Az InternalsVisibleTo attribútum használatával lehet megjelölni egy vagy akár több assembly-t barátként.
Ezt az attribútumot annak a projektnek az AssemblyInfo.cs fájljába kell tenni, amelyiket szeretnénk elérhetővé tenni:
[assembly: InternalsVisibleTo("UnitTestProject")]
Ennek hatására projektszinten minden, ami internal láthatóságú, elérhetővé válik a barát számára.