[問題] 單元測試的串列通訊問題

作者: chuinzong (阿榮)   2020-05-28 16:52:54
各位好:
在網路上有看到關於串列通訊用Mock測試,
程式碼如下。
範例主程式
public interface ISerialPort
{
void WriteLine(string text);
void ReadLine(string text);
}
public class MyDevice
{
private ISerialPort _port;
public MyDevice(ISerialPort port)
{
_port = port;
}
public DeviceResponse Read(...)
{
_port.WriteLine(...);
string response = _port.ReadLine();
// Parse the response.
return new DeviceResponse(response);
}
}
範例單元測試
[TestClass]
public class MyDeviceTests
{
[TestMethod]
public void Read_CheckWriteLineIsCalledWithAppropriateString()
{
Mock<ISerialPort> port = new Mock<ISerialPort>();
MyDevice device = new MyDevice(port.Object);
device.Read(...);
port.Verify(p => p.WriteLine("SpecificString"));
}
[TestMethod]
public void Read_DeviceRespondsCorrectly()
{
Mock<ISerialPort> port = new Mock<ISerialPort>();
MyDevice device = new MyDevice(port.Object);
port.Setup(p => p.ReadLine()).Returns("SomeStringFromDevice");
DeviceResponse response = device.Read(...);
// Asserts here...
}
...
}
單元測試是使用Mock,就是假定有連到串列埠,去吐資料回來。
可是這份程式,看起來要連接實體的Comport好像不行。
SerialPort My_SerialPort;
My_SerialPort = new My_SerialPort($"COM1", BaudRate);
My_SerialPort.Open();
想請問說要怎修改才能夠連接到網路程式碼的ISerialPort
傳入到主程式,可是做通訊也可以做Mock單元測試。
如有問題,在煩請各位請教
謝謝
作者: MasterChang (我愛ASM)   2020-05-28 18:41:00
可以開虛擬串口測試。
作者: chuinzong (阿榮)   2020-05-28 20:33:00
可是根據單元測試的想法,不就是為了要將程式外部的連結拿掉。所以不用虛擬埠,才用mock去創造資料嗎?我是想說往這部分發展
作者: MasterChang (我愛ASM)   2020-05-29 00:21:00
很堅持就自己改
作者: ssccg (23)   2020-05-29 09:33:00
看不懂你的問題是什麼,是說這份的ISerialPort不能當成你的My_SerialPort用? 要連接實體的Comport好像不行是指啥基本上這個程式只是一個概念說明,假設你有實際功能的物件是My_SerialPort,你要把所有用My_SerialPort的地方改用你自己定義的ISerialPort,My_SerialPort實作ISerialPort在測試時則是用Mock的ISerialPort,不會用到My_SerialPort
作者: mepowerlmay (用心,找對人)   2020-05-31 01:40:00
有用到returns 看起來有用隔離框架?試試看 單元測試的隔離框架寫法?
作者: chuinzong (阿榮)   2020-05-31 21:34:00
我知道問題點,就是在介面實作分成Mock及ComPort!就是要用用隔離框架感謝以上三位大大提供的解決方案,從中學習到

Links booklink

Contact Us: admin [ a t ] ucptt.com