日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何在单个测试中同时执行多个断言

發(fā)布時間:2023/12/4 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在单个测试中同时执行多个断言 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

雖然,推薦做法是每次測試只斷言一件事,但是,在實(shí)際工作中,我們可能需要對同一個對象同時執(zhí)行多個斷言。

例如,微軟官方示例項目eShopOnContainers有一個測試用例的實(shí)現(xiàn)代碼如下:

[Fact] public?async?Task?Add_to_cart_success() {//Arrangevar?fakeCatalogItem?=?GetFakeCatalogItem();_basketServiceMock.Setup(x?=>?x.AddItemToBasket(It.IsAny<ApplicationUser>(),?It.IsAny<Int32>())).Returns(Task.FromResult(1));//Actvar?orderController?=?new?CartController(_basketServiceMock.Object,?_catalogServiceMock.Object,?_identityParserMock.Object);orderController.ControllerContext.HttpContext?=?_contextMock.Object;var?actionResult?=?await?orderController.AddToCart(fakeCatalogItem);//AssertAssert.Equal("Catalog",?redirectToActionResult.ControllerName);Assert.Equal("Index",?redirectToActionResult.ActionName); }

如果我們將所有斷言都改成必定失敗:

//Assert Assert.Equal("WrongCatalog",?redirectToActionResult.ControllerName); Assert.Equal("WrongIndex",?redirectToActionResult.ActionName);

但運(yùn)行測試時,只會提示第一個失敗的斷言:

在這種情況下,一個個斷言去驗(yàn)證并修正比較耗時。

如果同時能夠看到所有失敗的斷言則更加有幫助。

手工實(shí)現(xiàn)

查看`Assert.Equal`的實(shí)現(xiàn)代碼[1],它是通過拋出EqualException異常來表明斷言失敗:

public?static?void?Equal<T>(T?expected,?T?actual,?IEqualityComparer<T>?comparer) {GuardArgumentNotNull(nameof(comparer),?comparer);var?expectedAsIEnum?=?expected?as?IEnumerable;var?actualAsIEnum?=?actual?as?IEnumerable;//?If?both?are?IEnumerable?(or?null),?see?if?we?got?an?AssertEqualityComparer<T>,?so?that//?we?can?invoke?it?to?get?the?mismatched?index.if?((expectedAsIEnum?!=?null?&&?(actual?==?null?||?actualAsIEnum?!=?null))?||(actualAsIEnum?!=?null?&&?expected?==?null)){var?aec?=?comparer?as?AssertEqualityComparer<T>;int??mismatchedIndex;if?(aec?!=?null?&&?!aec.Equals(expected,?actual,?out?mismatchedIndex)){if?(mismatchedIndex.HasValue)throw?EqualException.FromEnumerable(expectedAsIEnum,?actualAsIEnum,?mismatchedIndex.Value);elsethrow?new?EqualException(expected,?actual);}}if?(!comparer.Equals(expected,?actual))throw?new?EqualException(expected,?actual); }

而所有斷言異常都繼承自基類XunitException:

因此,我們可以捕獲每個斷言的異常,然后將多個異常添加到集合中,在測試結(jié)束時再拋出:

var?xunitExceptions?=?new?List<XunitException>(); try {Assert.Equal("WrongCatalog",?redirectToActionResult.ControllerName); } catch?(XunitException?ex) {xunitExceptions.Add(ex); }try {Assert.Equal("WrongIndex",?redirectToActionResult.ActionName); } catch?(XunitException?ex) {xunitExceptions.Add(ex); }if?(xunitExceptions.Any()) {throw?new?AggregateException(xunitExceptions.ToArray()); }

這里雖然列出了所有失敗斷言,但是所有錯誤顯示了2遍,而且我們必須為測試編寫大量的try-catch代碼。

有不有更好的方法呢?!

FluentAssertions

FluentAssertions是一組.NET擴(kuò)展方法,允許用更自然的語法去驗(yàn)證斷言。

引用Nuget包FluentAssertions,示例的斷言可以修改成如下格式:

redirectToActionResult.ControllerName.Should().Be("WrongCatalog"); redirectToActionResult.ActionName.Should().Be("WrongIndex");

除此之外,還可以將多個斷言放到一個AssertionScope中,以便FluentAssertions在所有失敗的范圍末尾拋出一個異常:

using?(new?FluentAssertions.Execution.AssertionScope()) {redirectToActionResult.ControllerName.Should().Be("WrongCatalog");redirectToActionResult.ActionName.Should().Be("WrongIndex"); }

結(jié)論

有時,將多個斷言組合在一起測試是有意義的。

在這種情況下,可以使用FluentAssertions的AssertionScope來編寫此類測試。

如果你覺得這篇文章對你有所啟發(fā),請關(guān)注我的個人公眾號”My IO“

參考資料

[1]

Assert.Equal的實(shí)現(xiàn)代碼: https://github.com/xunit/assert.xunit/blob/main/EqualityAsserts.cs#L78

總結(jié)

以上是生活随笔為你收集整理的如何在单个测试中同时执行多个断言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。