進度條

[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. 單元測試初始化與清除

 

 


最後,如果你喜歡我們的文章,別忘了到我們的FB粉絲團按讚喔!!

Medium 0

Toyo

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