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

看板C_Sharp (C#)作者 (阿榮)時間3年前 (2020/05/28 16:52), 編輯推噓1(1015)
留言16則, 4人參與, 3年前最新討論串1/1
各位好: 在網路上有看到關於串列通訊用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單元測試。 如有問題,在煩請各位請教 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.26.44.4 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1590655976.A.690.html

05/28 18:41, 3年前 , 1F
可以開虛擬串口測試。
05/28 18:41, 1F

05/28 20:33, 3年前 , 2F
可是根據單元測試的想法,不就是為了要將程式外部的連
05/28 20:33, 2F

05/28 20:33, 3年前 , 3F
結拿掉。所以不用虛擬埠,才用mock去創造資料嗎?
05/28 20:33, 3F

05/28 20:33, 3年前 , 4F
我是想說往這部分發展
05/28 20:33, 4F

05/29 00:21, 3年前 , 5F
很堅持就自己改
05/29 00:21, 5F

05/29 09:33, 3年前 , 6F
看不懂你的問題是什麼,是說這份的ISerialPort不能當成
05/29 09:33, 6F

05/29 09:36, 3年前 , 7F
你的My_SerialPort用? 要連接實體的Comport好像不行是指啥
05/29 09:36, 7F

05/29 09:39, 3年前 , 8F
基本上這個程式只是一個概念說明,假設你有實際功能的物件
05/29 09:39, 8F

05/29 09:40, 3年前 , 9F
是My_SerialPort,你要把所有用My_SerialPort的地方改用
05/29 09:40, 9F

05/29 09:40, 3年前 , 10F
你自己定義的ISerialPort,My_SerialPort實作ISerialPort
05/29 09:40, 10F

05/29 09:41, 3年前 , 11F
在測試時則是用Mock的ISerialPort,不會用到My_SerialPort
05/29 09:41, 11F

05/31 01:40, 3年前 , 12F
有用到returns 看起來有用隔離框架?試試看 單元測
05/31 01:40, 12F

05/31 01:40, 3年前 , 13F
試的隔離框架寫法?
05/31 01:40, 13F

05/31 21:34, 3年前 , 14F
我知道問題點,就是在介面實作分成Mock及ComPort!就是
05/31 21:34, 14F

05/31 21:34, 3年前 , 15F
要用用隔離框架
05/31 21:34, 15F

05/31 21:35, 3年前 , 16F
感謝以上三位大大提供的解決方案,從中學習到
05/31 21:35, 16F
文章代碼(AID): #1UptleQG (C_Sharp)
文章代碼(AID): #1UptleQG (C_Sharp)