ProgressBar

[C#][Unit Test] 07. Assert

本文利用C#與Visual Studio平台,來探討時下最夯的Unit Test。

作者: Toyo更新日期:

此系列文轉自我們的好朋友Toyo大大網誌(原文連結),在Windows業界耕耘了多年,累積了不少實戰經驗。此為他專門設計為新人的單元測試教學,進度條獲授權轉載。

原文標題:  【Unit Test】Day 7 - Assert

 

Demo檔案 : Git傳送門

 

今天要來談談驗證,還記得之前的PTX範例都只驗證名稱嗎?

//assert
Assert.AreEqual(actual.Name, expected);

 

 

因為有說如果是參考型別的話,Assert.AreEqual可能會驗證失敗。

 

[TestMethod]
public void 透過Assert驗證參考型別()
{
    //arrange
    Guid ID = Guid.NewGuid();
    var expected = new Member
    {
        ID = ID,
        Name = "Name"
    };
 
    //act
    var actual = new Member
    {
        ID = ID,
        Name = "Name"
    };
 
    //assert
    Assert.AreEqual(expected,actual);
}

 

 

結果

 

 

試試看改一下寫法

 


[TestMethod]
public void 透過Assert驗證參考型別2()
{
    //arrange
    Guid ID = Guid.NewGuid();
    var expected = new Member
    {
        ID = ID,
        Name = "Name"
    };
 
    //act
    var actual = expected;
 
    //assert
    Assert.AreEqual(expected, actual);
}

 

 

 

原來Assert.AreEqual當碰到參考型別的時候是驗證記憶體位置,但其實像我是寫商業邏輯的,常常在乎的是透過方法執行完後得到的DTOData Transfer Object)是否符合預期,這樣其實Assert對我來說不是那麼方便。

 

 

 

 

如果我真的只想驗證執行完的DTO內容是否符合預期,該怎麼做呢?來看看FluentAssertions吧!

 

 

 

 

在單元測試專案用Nuget安裝完成後,來看看範例寫法。

 

 

[TestMethod]
public void 透過FluentAssertions驗證參考型別()
{
    //arrange
    Guid ID = Guid.NewGuid();
    var expected = new Member
    {
        ID = ID,
        Name = "Name"
    };
 
    //act
    var actual = new Member
    {
        ID = ID,
        Name = "Name"
    };
 
    //assert
    actual.ShouldBeEquivalentTo(expected);
 
}

 

 

就這麼簡單,它就會幫你驗證內容的值而不是記憶體位置,而且可讀性也很高,再舉幾個範例。

 

 

是否為Null

 

[TestMethod]
public void 透過FluentAssertions驗證不為Null()
{
    //arrange
     
    //act
    var actual = new Member
    {
        ID = Guid.NewGuid(),
        Name = "Name"
    };
 
    //assert
    actual.Should().NotBeNull();
}
 

[TestMethod]
public void 透過FluentAssertions驗證為Null()
{
    //arrange
 
    //act
    Member actual = null;
 
    //assert
    actual.Should().BeNull();
}

 

 

驗證數字。

 

[TestMethod]
public void 透過FluentAssertions驗證數字()
{
    //arrange
 
    //act
    int actual = 123;
 
    //assert
    actual.Should().Be(123);
}

 

驗證趨近於

 

倍精準相加時會有些微誤差。

 

[TestMethod]
public void 透過FluentAssertions驗證趨近於()
{
    //arrange
    var a = 1.3;
    var b = 0.1;
    //act
    double actual = a + b ;
 
    //assert
    actual.Should().Be(1.4);
}

 

 

 

驗證地方可改成

 

 

//assert
//趨近於1.4 且如果誤差小於0.00001時視為一樣
actual.Should().BeApproximately(1.4,0.00001);

 

 

驗證排序

 

[TestMethod]
public void 透過FluentAssertions驗證升冪排序()
{
    //arrange
    var parameter = new List { 4, 7, 1, 3, 8 };
    //act
    var actual = parameter.OrderBy(x=>x);
 
    //assert
    actual.Should().BeInAscendingOrder();
}
 

[TestMethod]
public void 透過FluentAssertions驗證降冪排序()
{
    //arrange
    var parameter = new List { 4, 7, 1, 3, 8 };
    //act
    var actual = parameter.OrderByDescending(x => x);
 
    //assert
    actual.Should().BeInDescendingOrder();
}

 

結論

 

FluentAssertions是個閱讀性高且豐富的驗證套件,以上提供一些我常常使用到的斷言方法,還有很多可以參考官網文件,那今天就先到這了!!

 

上一篇:[C#][Unit Test] 06. 單元測試初始化與清除

 

 

Toyo

Toyo

年過30在軟體業載浮載沉的工程師, 期望靠著一點一滴累積與努力, 讓自己墊起腳能勾到一點點的夢想

線上課程

2026 AI實戰基礎篇

2026 AI實戰基礎篇

Laravel 後端PHP架站,API Server與訂閱軟體全攻略

Laravel 後端PHP架站,API Server與訂閱軟體全攻略

WordPress - 從頭教起的網站架設

WordPress - 從頭教起的網站架設

程式客製WooCommerce,WordPress購物系統全解析

程式客製WooCommerce,WordPress購物系統全解析

Electron 跨平台桌面程式,建立點餐系統與裝置控制

Electron 跨平台桌面程式,建立點餐系統與裝置控制

C語言 - 近代程式語言的基礎

C語言 - 近代程式語言的基礎

ES6,ReactJS與Webpack,前端JavaScript全攻略

ES6,ReactJS與Webpack,前端JavaScript全攻略

從零開始的SQL語法與資料庫設計 - 以MySQL來攻略

從零開始的SQL語法與資料庫設計 - 以MySQL來攻略

Linux雲端伺服器,用AWS暸解Apache與Nginx

Linux雲端伺服器,用AWS暸解Apache與Nginx

HTML, CSS, JavaScript, jQuery 網頁從零開始

HTML, CSS, JavaScript, jQuery 網頁從零開始

Git程式版本管控 - 由簡單到難

Git程式版本管控 - 由簡單到難

網路關鍵字佔領技術,微創業與數位行銷正規作戰方式

網路關鍵字佔領技術,微創業與數位行銷正規作戰方式

快速開發,從頭教起的Ruby on Rails後端之旅

快速開發,從頭教起的Ruby on Rails後端之旅

行動第一! 使用Bootstrap建立響應式RWD網站!

行動第一! 使用Bootstrap建立響應式RWD網站!