我有一套運行速度很慢的單元測驗,因為它們都做這樣的事情:
Assert.AreEqual(expected, actual, message: getDetailedErrorContext(expected, Actual));
在分析單元測驗時,大部分時間都花在生成這些詳細的錯誤背景關系訊息上,這些訊息永遠不會被使用,因為測驗正在通過。
是否Microsoft.VisualStudio.TestTools.UnitTesting天生支持延遲生成的錯誤訊息?我注意到所有測驗方法都有多載,例如:
Assert.AreEqual(expected, actual, message, params object[] parameters);
這讓我可以將物件傳遞給格式字串,但我不清楚如何使用它,例如當訊息生成為類似
Assert.AreEqual(expected.Count, actual.Count, "All the items in the list are: "
String.Join(", ", actual.Select(o => $"[{o.Id}: {o.Description}]"));
如果(且僅當)測驗斷言失敗時,我可以使用一些現有的類來評估我想要的訊息嗎?理想情況下,我希望有一個解決方案,例如:
Assert.AreEqual(expected, actual, () => getDetailedErrorContext(expected, Actual));
如果斷言沒有失敗,則永遠不會評估 lambda。
請注意,我考慮過一種解決方案,例如將所有斷言方法替換為:
if (expected != actual)
Assert.Fail(getDetailedErrorContext(expected, Actual));
但我不喜歡這個有幾個原因(比如不想復制像Assert.AreEqual<double>(' 的內置 delta 容差之類的東西,以及這將在重構我們的測驗套件時造成的總體困難。)
uj5u.com熱心網友回復:
到目前為止,由于缺乏更明顯的解決方案,我創建了以下包裝器Lazy<T>,唯一的區別是它會在ToString()被呼叫時實際決議值:
public class LazyString : Lazy<string>
{
public LazyString(Func<string> stringBuilder) : base(stringBuilder) { }
public override string ToString() => Value;
}
然后我可以將其用作:
Assert.AreEqual(expected, actual, "{0}", new LazyString(() =>
getDetailedErrorContext(expected, Actual)));
它有點難看且容易出錯(如果忘記插入格式字串"{0}",但它可以作業并且是我能想到的最好的。遺憾的是, Assert該類是密封的,所以我什至無法用我自己的多載干凈地擴展它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/488720.html
