Abbiamo parlato di “Ensure” e del suo rapporto con lo StackTrace ma mi sono dimenticato il pezzetto importante e giustamente Antonio se ne è accorto :-)
Eccoci:
class SourceInfo
{
    public readonly static SourceInfo Empty = new SourceInfo( "", "", MemberTypes.Custom );

    public SourceInfo( String methodName, String className, MemberTypes sourceType )
    {
        this.MethodName = methodName;
        this.ClassName = className;
        this.SourceType = sourceType;
    }

    public String MethodName { get; private set; }
    public String ClassName { get; private set; }
    public MemberTypes SourceType { get; private set; }
}
Utilizzando questa come dto possiamo scrivere qualcosa del tipo:
public static class Ensure
{
    public static Ensure That( T obj )
    {
        SourceInfo si = SourceInfo.Empty;

        var st = new StackTrace( 1 );
        if( st.FrameCount > 0 )
        {
            var f = st.GetFrame( 0 );
            var mi = f.GetMethod();
            if( mi != null )
            {
                si = new SourceInfo( mi.DeclaringType.Name, mi.Name, mi.MemberType );
            }
        }

        return new Ensure( obj, si );
    }
}
Che altro non fa che recuperare le informazioni sullo stack frame precedente al nostro che è necessariamente il chiamante.
A questo punto diventa abbastanza banale far passare un test come questo:
[TestMethod]
public void ensure_getFullErrorMessage_should_contain_all_relevant_information()
{
    var obj = Ensure.That( "" );
    String actual = obj.GetFullErrorMessage( "validator specific message" );

    var containsClassName = actual.Contains( typeof( ValidatorTest ).Name );
    var containsMethodName = actual.Contains( typeof( ValidatorTest ).Name );

    containsClassName.ShouldBeTrue();
    containsMethodName.ShouldBeTrue();
}
.m