The internal keyword makes a class (including nested classes), property, method or field available to every consumer in the same assembly:
internal class Foo
{
    internal string SomeProperty {get; set;}
}
internal class Bar
{
    var myInstance = new Foo();
    internal string SomeField = foo.SomeProperty;
    internal class Baz
    {
        private string blah;
        public int N { get; set; }
    }
}
This can be broken to allow a testing assembly to access the code via adding code to AssemblyInfo.cs file:
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("MyTests")]