[英]Is it possible to wrap each test execution in XUnit?
我有一個異常被包含一些有用信息的多個測試拋出。 默認情況下,失敗的單元測試日志不包含該信息,因為它是自定義異常的屬性。
我可以做這個:
try
{
// Run code that casts MyException
}
catch (MyException e)
{
// Extra logging for e.SomeProperty
throw;
}
但是我將不得不為每一個測試做這個。 有什么地方可以對測試 class 的所有測試執行此操作嗎? 有點像 Asp.Net 中的中間件。
或者一些在 XUnit 之前處理異常的替代方法。
如果MyException
是您定義的類型,您可能需要考慮將Exception.Message
更改為用戶輸入的內容和有用信息的串聯,因為通常您希望 Message 盡可能對您有幫助。
public class MyException : Exception
{
public MyException(string message)
: base($"{message}: {SomeProperty}") { }
// other constructors...
public required object SomeProperty { get; init; }
}
但是,如果您不能或不想這樣做,您還可以為您的測試提供一個幫助程序 function,它使用 try-catch 中的回調並使用更合適的信息重新拋出異常。 異常可以包含在其他異常中,從而允許顯示每個異常。
static void Do(Action act)
{
try
{
act();
}
catch (MyException my)
{
throw new($"something something foobar: {my.SomeProperty}", my);
}
}
(切記一些 linters 會告訴你拋出一個簡單的Exception
是不好的,但對於測試來說這無關緊要。)
您最終可以像這樣在測試中使用它:
[Fact]
void Foo() => Do(() =>
{
// your function goes here!
// you can simply throw the exception to test out how it'll look like
throw new MyException("yay") { SomeProperty = "context value" };
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.