簡體   English   中英

xUnit:多重斷言或軟斷言

[英]xUnit : Mutiple Assertions or Soft Assert

如何在 xUnit 中找到多個斷言或軟斷言? 我發現 Nunit 有以下能力,試圖在 xUnit 中找到類似的選項。

Assert.Multiple(() =>
 {
   Assert.AreEqual(expectedResult1, actualResult1, "Mismatch in Score1!");
   Assert.AreEqual(expectedResult2, actualResult2, "Mismatch in Score2!");
   Assert.AreEqual(expectedResult3, actualResult3, "Mismatch in Score3!");
  });

不存在

我們可以做很多事情,但出於很多原因,我們選擇不做。 這個原因包括: (a) 實施和維護成本; (b) 相互競爭的優先事項; (c) 對特征的哲學反對。

在這種情況下,您與 (c) 發生沖突。 我們不認為一個單元測試框架應該運行多個失敗的斷言。

xUnit 通常比 NUnit 更固執己見,出於意識形態原因,不會包含 NUnit 支持的內容。

將您的測試用例放入IEnumerable<T>並使用Assert.All<T>()

var expectations = new List<Tuple<object, object>>()
{
    new(expectedResult1, actualResult1),
    new(expectedResult2, actualResult2),
    new(expectedResult3, actualResult3),
};
Assert.All(expectations, pair => Assert.Equal(pair.Item1, pair.Item2));

如果您喜歡 BDD / fluent 風格的斷言,您可以考慮使用以下庫之一,它們都與 xUnit 完全兼容:

using (new AssertionScope())
{
   actualResult1.Should().Be(expectedResult1, "Mismatch in Score1!");
   actualResult2.Should().Be(expectedResult2, "Mismatch in Score2!");
}
var mrBurns = new Person { Name = null };
mrBurns.ShouldSatisfyAllConditions(
   () => mrBurns.Name.ShouldNotBeNullOrEmpty(),
   () => mrBurns.Name.ShouldBe("Mr.Burns"));

實際上它現在存在https://github.com/xunit/assert.xunit/blob/main/MultipleAsserts.cs ,在問題1920得到解決之后。 它首先在 assert.xunit-tag2.4.2-pre.19和 NuGet-package assert.xunit 2.4.2-pre.12 中發布 另請參閱xUnit.net 2.4.2 預發布版(內部版本 12)的發行說明

問題的例子可以寫成

Assert.Multiple(
    () => Assert.AreEqual(expectedResult1, actualResult1, "Mismatch in Score1!"),
    () => Assert.AreEqual(expectedResult2, actualResult2, "Mismatch in Score2!"),
    () => Assert.AreEqual(expectedResult3, actualResult3, "Mismatch in Score3!"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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