[C#.NET] 單元測試 - 如何使用 NSubstitute.Arg 參數條件及回傳結果驗証

[C#.NET] 單元測試 - 如何使用 NSubstitute.Arg 參數條件及回傳結果驗証

NSubstitute.Arg 是用來模擬特定參數組合,這算是蠻常使用的一個隔離技巧

 

Note:

有關 NSubstitute 的用法:

  • 模擬物件 ICalculator 實體化:Substitute.For<ICalculator>()
  • 模擬目標物件回傳結果10:.Returns(10)

 

有關隔離技巧 Stub、Mock、Fake:

下圖出自:http://www.dotblogs.com.tw/hatelove/archive/2012/11/29/learning-tdd-in-30-days-day7-unit-testing-stub-mock-and-fake-object-introduction.aspx.aspx


接著來演練

我有一個介面

interface ICalculator{
    int Add(int first, int senond);
} 
 

忽略參數:

使用 Arg.Any<T>()  忽略 T 型別的参數

public void IgnoringArgument_Test()
{
    //arrange
    var calculator = Substitute.For<ICalculator>();
    var expected = 10;

    //當模擬第一個参數是任意數,第二個等於5時,返回10
    calculator.Add(Arg.Any<int>(), 5).Returns(10);

    //act
    var actual1 = calculator.Add(123, 5);
    var actual2 = calculator.Add(-9, 5);
    var actual3 = calculator.Add(-9, -9);

    //assert
    Assert.AreEqual(expected, actual1);
    Assert.AreEqual(expected, actual2);
    Assert.AreNotEqual(expected, actual3);
}

 

參數條件匹配:

使用 Arg.Is<T>(Predicate<T> condition) 為 T 型別的参數設定條件

public void ArgumentMatch_Test()
{
    //arrange
    var calculator = Substitute.For<ICalculator>();
    var expected = 123;


    //當模擬第一個参數是任意數,第二個參數小於0時,返回123
    calculator.Add(Arg.Any<int>(), Arg.Is<int>(x => x < 0)).Returns(123);
    //當模擬兩個參數都等於0時,返回123
    calculator.Add(Arg.Is(0), Arg.Is(0)).Returns(123);

    //act
    var actual1 = calculator.Add(1, -2);
    var actual2 = calculator.Add(1, 2);
    var actual3 = calculator.Add(0, 0);

    //assert
    Assert.AreEqual(expected, actual1);
    Assert.AreNotEqual(expected, actual2);
    Assert.AreEqual(expected, actual3);
}

 

略過所有參數:

public void ReturnForAnyArgs_Test()
{
    //arrange
    var calculator = Substitute.For<ICalculator>();
    var expected = 100;
    //不論參數是什麼返回100
    calculator.Add(1, 2).ReturnsForAnyArgs(100);

    //act
    var actual1 = calculator.Add(1, 2);
    var actual2 = calculator.Add(-7, 15);

    //assert
    Assert.AreEqual(expected, actual1);
    Assert.AreEqual(expected, actual2);
}

 


文章出自:[C#.NET] 單元測試 - 如何使用 NSubstitue.Arg 參數條件及回傳結果驗証 | 余小章 @ 大內殿堂 - 點部落 (dotblogs.com.tw)

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo