[C#.NET] 單元測試 Mock Framework - NSubstitute

[C#.NET] 單元測試 Mock Framework - NSubstitute

91哥在課堂上力推這一套 mock framework,自己本來是在用 moq 這一套,現在才有空自己動手體驗一下 NSubstitute 的威力

image

 

 

 

安裝好 NSubstitute 後,會有一個 readme.txt 文檔,看完它應該就能無痛使用了

image

 

 

也可以從 google 搜尋 NSubstitute,得到 NSubstitute 官網的文件說明

http://nsubstitute.github.io/help/getting-started/

 

可以找到對岸高手寫的相關系列文章,感覺起來是從官網直接翻譯

http://www.cnblogs.com/gaochundong/archive/2013/05/22/nsubstitute_manual.html

 

接下來就來使用看看,以下是我的專案裡的片斷程式碼

public interface IModbusSocket
{
    int SendTimeout { get; set; }

    int ReceiveTimeout { get; set; }

    int RetryTimeInterval { get; set; }

    int RetryTime { get; set; }

    bool IsConnected { get; set; }

    bool Connect<T>(T ConnectConfig);

    bool Disconnect();

    int Send(byte[] requestArray);

    byte[] Receive();
}

public class RtuModbusClient : ModbusClientBase
{
    public IModbusSocket ModbusSocket { get; set; }
    ……

}

 

當時使用 moq 寫的片斷測試程式

private static RtuModbusClient s_client = null;

public RtuModbusClientUnitTest()
{
    if (s_stubModbusSocket == null)
    {
        s_stubModbusSocket = new Mock<IModbusSocket>();
        s_stubModbusSocket.Setup(
         o => o.Connect<SerialModbusConnectConifg>(new SerialModbusConnectConifg()
         {
         })).Returns(true);
    }
    if (s_client == null)
    {
        s_client = new RtuModbusClient();
        s_client.ModbusSocket = s_stubModbusSocket.Object;
    }
}

 

換成了 NSubstitute 後,模擬被測程式(Product Code)的語意變得更加清楚了

private static IModbusSocket s_stubModbusSocket;
public RtuModbusClientUnitTest()
{
    if (s_stubModbusSocket==null)
    {
        s_stubModbusSocket = Substitute.For<IModbusSocket>();
        s_stubModbusSocket.Connect<SerialModbusConnectConifg>(new SerialModbusConnectConifg()).Returns(true);
    }
    if (s_client==null)
    {
        s_client = new RtuModbusClient();
        s_client.ModbusSocket = s_stubModbusSocket;
    }
}

 

若沒有意外,應該會從 moq 跳槽到 NSubstitube

文章出自:https://www.dotblogs.com.tw/yc421206/2015/02/16/149495

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


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

Image result for microsoft+mvp+logo