[C#.NET] 單元測試 - 如何使用 NSubstitute 測試 void 方法的 out / ref

[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:

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

 

接下來將演練有回傳值的 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

Image result for microsoft+mvp+logo