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.
Çarpıcı. Test kütüphaneleri en çılgın hileleri içerir. – Stilgar