看着代碼,這很聰明。
魔法發生在ActualCodeTextGetter
類。首先,它使用堆棧跟蹤檢索的源代碼文件的行:
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;
一旦它的源代碼文件的名稱,與它一同和聲明的偏移量,它只是一個閱讀材料直接文件:
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;
}
還有很多更多的邏輯回事精確孤立的語句,但在很短的訣竅是:
- 使用堆棧跟蹤檢索源共同的位置德及本聲明
- 線分析源代碼以獲取準確的說法
當然,它可以,如果你你用來編譯的代碼在同一臺機器上運行它才能正常工作。
令人驚歎。測試庫包含最瘋狂的技巧。 – Stilgar