簡體   English   中英

是否可以將每個測試執行包裝在 XUnit 中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM