[C#.NET] 單元測試 Mock Framework - NSubstitute
91哥在課堂上力推這一套 mock framework,自己本來是在用 moq 這一套,現在才有空自己動手體驗一下 NSubstitute 的威力
安裝好 NSubstitute 後,會有一個 readme.txt 文檔,看完它應該就能無痛使用了
也可以從 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