2016-10-10 10 views
16

Shouldly assertion library for .NET bir şekilde, onaylama yönteminin hangi ifadede çağrıldığını bilir; böylece iletide görüntüleyebilir. Nasıl çalıştığını bulmaya çalıştım ama kaynak kodunda kayboldum. Derlenmiş koda baktığından şüpheleniyorum ama bunun nasıl gerçekleştiğini görmek isterim. belgelerineShouldly iddia kitaplığı iddianın uygulandığı ifadeyi nasıl biliyor?

map.IndexOfValue("boo").ShouldBe(2); // -> map.IndexOfValue("boo") should be 2 but was 1 

nasılsa Shouldly ("boo") ifadesi map.IndexOfValue bilir ve test hatası mesajında ​​görüntülemek başardı. Bunun nasıl olduğunu bilen var mı?

cevap

15

Kod baktığımızda oldukça akıllı.

ActualCodeTextGetter sınıfında sihir gerçekleşiyor. Birincisi, stacktrace kullanarak kaynak kod dosyasının satırı alır: Bu hat ile birlikte, kaynak kod dosyasının adı vardır ve ifadenin ofset kez

StackTrace stackTrace = trace ?? new StackTrace(true); 

    // Cut for brevity 

    StackFrame stackFrame = frame; 
    this.ShouldlyFrameIndex = index - 1; 
    string fileName = stackFrame.GetFileName(); 
    this._determinedOriginatingFrame = fileName != null && File.Exists(fileName); 
    this._shouldMethod = this.ShouldlyFrame.GetMethod().Name; 
    this.FileName = fileName; 
    this.LineNumber = stackFrame.GetFileLineNumber() - 1; 

, bu okuma meselesi doğrudan dosya:

private string GetCodePart() 
{ 
    string str = "Shouldly uses your source code to generate its great error messages, build your test project with full debug information to get better error messages\nThe provided expression"; 
    if (this._determinedOriginatingFrame) 
    { 
    string codeLines = string.Join("\n", ((IEnumerable<string>) File.ReadAllLines(this.FileName)).Skip<string>(this.LineNumber).ToArray<string>()); 
    int indexOfMethod = codeLines.IndexOf(this._shouldMethod); 
    if (indexOfMethod > 0) 
     str = codeLines.Substring(0, indexOfMethod - 1).Trim(); 
    str = !str.EndsWith("Should") ? str.RemoveVariableAssignment().RemoveBlock() : this.GetCodePartFromParameter(indexOfMethod, codeLines, str); 
    } 
    return str; 
} 

kesin ifadeyi izole etmek oluyor çok fazla mantık var, ama kısaca hile:

  • Kullanım StackTrace kaynak ko yerini almak için de ve deyimi
  • hattı size kodu derlemek için kullanılan aynı makinede çalıştırıyorsanız Tabii

, sadece çalışabilir tam deyimi almak için kaynak kodunu Ayrıştırma.

+0

Çarpıcı. Test kütüphaneleri en çılgın hileleri içerir. – Stilgar

İlgili konular