@@ -49,40 +49,6 @@ public async Task GetOrCreate_Ok()
4949 await factory . DisposeAsync ( ) ;
5050 }
5151
52- [ Fact ]
53- public async Task OnCompleted_Ok ( )
54- {
55- var port = 8882 ;
56- var server = StartTcpServer ( port , MockSplitPackageAsync ) ;
57-
58- var client = CreateClient ( ) ;
59- await client . ConnectAsync ( "localhost" , port ) ;
60-
61- // 获得 client 内部 Socket 对象
62- var clientField = client . GetType ( ) . GetField ( "_client" , System . Reflection . BindingFlags . NonPublic | System . Reflection . BindingFlags . Instance ) ;
63- Assert . NotNull ( clientField ) ;
64-
65- var tcpClient = clientField . GetValue ( client ) as TcpClient ;
66- Assert . NotNull ( tcpClient ) ;
67-
68- var senderType = Type . GetType ( "Longbow.TcpSocket.Sender, Longbow.TcpSocket" ) ;
69- Assert . NotNull ( senderType ) ;
70-
71- var sender = Activator . CreateInstance ( senderType , tcpClient . Client ) ;
72-
73- // 反射获得 OnCompleted 方法
74- var method = senderType . GetMethod ( "OnCompleted" , System . Reflection . BindingFlags . NonPublic | System . Reflection . BindingFlags . Instance ) ;
75- Assert . NotNull ( method ) ;
76-
77- // 反射获得 SendAsync 方法
78- var sendAsyncMethod = senderType . GetMethod ( "SendAsync" , System . Reflection . BindingFlags . Public | System . Reflection . BindingFlags . Instance ) ;
79- Assert . NotNull ( sendAsyncMethod ) ;
80-
81- // 调用 SendAsync 方法
82- ReadOnlyMemory < byte > buffer = new byte [ 2048 ] ;
83- sendAsyncMethod . Invoke ( sender , [ buffer ] ) ;
84- }
85-
8652 [ Fact ]
8753 public async Task SendAsync_Ok ( )
8854 {
@@ -117,6 +83,53 @@ public async Task SendAsync_Ok()
11783 StopTcpServer ( server ) ;
11884 }
11985
86+ [ Fact ]
87+ public async Task SendAsync_BufferList_Ok ( )
88+ {
89+ var port = 8883 ;
90+ var server = StartTcpServer ( port , MockSplitPackageAsync ) ;
91+
92+ var client = CreateClient ( ) ;
93+
94+ // 连接 TCP Server
95+ await client . ConnectAsync ( "localhost" , port ) ;
96+
97+ var buffer = new List < ArraySegment < byte > >
98+ {
99+ new byte [ 2 ] ,
100+ new byte [ 3 ]
101+ } ;
102+ var result = await client . SendAsync ( buffer ) ;
103+ Assert . True ( result ) ;
104+
105+ // 关闭连接
106+ StopTcpServer ( server ) ;
107+ }
108+
109+ [ Fact ]
110+ public void Sender_Coverage_Ok ( )
111+ {
112+ // 利用反射测试 Sender OnCompleted 方法覆盖率
113+ var type = Type . GetType ( "Longbow.TcpSocket.Sender, Longbow.TcpSocket" ) ;
114+ Assert . NotNull ( type ) ;
115+
116+ var instance = Activator . CreateInstance ( type , new Socket ( AddressFamily . InterNetwork , SocketType . Stream , ProtocolType . Tcp ) ) ;
117+ Assert . NotNull ( instance ) ;
118+
119+ var method = type . GetMethod ( "OnCompleted" , System . Reflection . BindingFlags . NonPublic | System . Reflection . BindingFlags . Instance ) ;
120+ Assert . NotNull ( method ) ;
121+
122+ method . Invoke ( instance , [ new MockSocketAsyncEventArgs ( ) ] ) ;
123+ }
124+
125+ class MockSocketAsyncEventArgs : SocketAsyncEventArgs
126+ {
127+ public MockSocketAsyncEventArgs ( )
128+ {
129+ SocketError = SocketError . SocketError ;
130+ }
131+ }
132+
120133 [ Fact ]
121134 public async Task ReceiveAsync_Ok ( )
122135 {
@@ -186,6 +199,22 @@ public async Task ReceiveAsync_Zero()
186199 server . Stop ( ) ;
187200 }
188201
202+ [ Fact ]
203+ public void Receiver_Coverage_Ok ( )
204+ {
205+ // 利用反射测试 Receiver OnCompleted 方法覆盖率
206+ var type = Type . GetType ( "Longbow.TcpSocket.Receiver, Longbow.TcpSocket" ) ;
207+ Assert . NotNull ( type ) ;
208+
209+ var instance = Activator . CreateInstance ( type , new Socket ( AddressFamily . InterNetwork , SocketType . Stream , ProtocolType . Tcp ) ) ;
210+ Assert . NotNull ( instance ) ;
211+
212+ var method = type . GetMethod ( "OnCompleted" , System . Reflection . BindingFlags . NonPublic | System . Reflection . BindingFlags . Instance ) ;
213+ Assert . NotNull ( method ) ;
214+
215+ method . Invoke ( instance , [ new MockSocketAsyncEventArgs ( ) ] ) ;
216+ }
217+
189218 [ Fact ]
190219 public async Task AddDataPackageAdapter_Ok ( )
191220 {
0 commit comments