[C#.NET] 單元測試 - 如何使用 NSubstitute.Arg 參數條件及回傳結果驗証
NSubstitute.Arg 是用來模擬特定參數組合,這算是蠻常使用的一個隔離技巧
Note:
有關 NSubstitute 的用法:
- 模擬物件 ICalculator 實體化:Substitute.For<ICalculator>()
- 模擬目標物件回傳結果10:.Returns(10)
有關隔離技巧 Stub、Mock、Fake:
接著來演練
我有一個介面
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