作者chuinzong (阿荣)
看板C_Sharp
标题[问题] 单元测试的串列通讯问题
时间Thu May 28 16:52:54 2020
各位好:
在网路上有看到关於串列通讯用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://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1590655976.A.690.html
1F:→ MasterChang: 可以开虚拟串口测试。 05/28 18:41
2F:→ chuinzong: 可是根据单元测试的想法,不就是为了要将程式外部的连 05/28 20:33
3F:→ chuinzong: 结拿掉。所以不用虚拟埠,才用mock去创造资料吗? 05/28 20:33
4F:→ chuinzong: 我是想说往这部分发展 05/28 20:33
5F:→ MasterChang: 很坚持就自己改 05/29 00:21
6F:→ ssccg: 看不懂你的问题是什麽,是说这份的ISerialPort不能当成 05/29 09:33
7F:→ ssccg: 你的My_SerialPort用? 要连接实体的Comport好像不行是指啥 05/29 09:36
8F:→ ssccg: 基本上这个程式只是一个概念说明,假设你有实际功能的物件 05/29 09:39
9F:→ ssccg: 是My_SerialPort,你要把所有用My_SerialPort的地方改用 05/29 09:40
10F:→ ssccg: 你自己定义的ISerialPort,My_SerialPort实作ISerialPort 05/29 09:40
11F:→ ssccg: 在测试时则是用Mock的ISerialPort,不会用到My_SerialPort 05/29 09:41
12F:推 mepowerlmay: 有用到returns 看起来有用隔离框架?试试看 单元测 05/31 01:40
13F:→ mepowerlmay: 试的隔离框架写法? 05/31 01:40
14F:→ chuinzong: 我知道问题点,就是在介面实作分成Mock及ComPort!就是 05/31 21:34
15F:→ chuinzong: 要用用隔离框架 05/31 21:34
16F:→ chuinzong: 感谢以上三位大大提供的解决方案,从中学习到 05/31 21:35