[C#.NET] 單元測試 - 如何使用 NSubstitute 測試 void 方法的 out / ref
When..Do 當發生什麼事時,做什麼事,當被測方法沒有回傳值時可以使用它
Note:
有關 NSubstitue 的用法:
- 模擬物件 ICalculator 實體化:Substitute.For<ICalculator>()
- 當目標方法參數為(2,1)時:.When(p => p.Subtract(2, 1, ref result))
- 幫我處理第三個參數(Returns也可以做這樣的事):.Do(p => p[2] = (int)p[0] - (int)p[1])
有關隔離技巧 Stub、Mock、Fake:
接下來將演練有回傳值的 out/ref 以及沒有回傳值的 out/ref
public interface ICalculator
{
bool Add(int first, int senond, out int result);
void Subtract(int first, int senond, ref int result);
}
有回傳值的 out/ref
x[2] = extected 代表設定第三個參數為 2
public void ReturnOutRefArgs_Test()
{
// Arrange
var result = 0;
var mock = Substitute.For<ICalculator>();
var extected = 2;
mock.Add(1, 1, out result).Returns(
x =>
{
x[2] = extected;
return true;
});
// Act
var actual = mock.Add(1, 1, out result);
// Assert
Assert.IsTrue(actual);
Assert.AreEqual(extected, result);
}
沒有回傳值的 out/ref
有回傳值使用 When..Do,它的意思是當條件成立時,做什麼事
When:p => p.Subtract(2, 1, ref result),當 Subtract 方法參數為(2,1)時,
Do:幫我處理第三個參數(Returns也可以做這樣的事),第一個參數減掉第二個參數
public void NoReturnOutRefArgs_Test()
{
// Arrange
var result = 0;
var mock = Substitute.For<ICalculator>();
mock.When(p => p.Subtract(2, 1, ref result)).Do(p => p[2] = (int)p[0] - (int)p[1]);
// Act
mock.Subtract(2, 1, ref result);
// Assert
Assert.AreEqual(1, result);
}
同理可証有回傳值的方法也可以用When..Do
不過這樣做會拿不到 return 的結果,若要拿 return 的結果應該要用 Returns()
public void ReturnOutRefArgs_Test1()
{
// Arrange
var result = 0;
var mock = Substitute.For<ICalculator>();
mock.When(p => p.Add(2, 1, out result)).Do(p =>
{
p[2] = (int)p[0] - (int)p[1];
});
// Act
mock.Add(2, 1, out result);
// Assert
Assert.AreEqual(1, result);
}
本文出自:https://www.dotblogs.com.tw/yc421206/2015/02/17/149515
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET