我得到了一个xUnit测试,它对一个专有的TCP协议实现进行了一些检查。该测试启动了一个模拟服务器,该服务器被指示在单元测试中向消费者发送它应该处理的一些数据:
[Fact]
public async void EmptyList()
{
string rawMessage = ...
MockServer server = new MockServer();
server.Start();
ManualResetEvent messageReceived = new ManualResetEvent(false);
CancellationTokenSource tokenSource = new CancellationTokenSource();
try
{
using (var cn = new Connection())
{
cn.MessageReceived += (s, e) =>
{
var m = e.Message;
Assert.Equal<CommandId>(CommandId.Command1, m.CommandId);
var l = m.GetList<int>("Users");
Assert.Equal(0, l.Count);
var emptyDict = m.GetComplexData<string>("EmptyComplex");
Assert.Equal(0, emptyDict.Count);
messageReceived.Set();
};
await cn.ConnectAsync(server.Hostname, server.Port, tokenSource.Token);
var receiveTask = cn.Receive(tokenSource.Token);
server.SendMessageToAll(rawMessage); // mock server send the connected client some sample data
messageReceived.WaitOne(TimeSpan.FromSeconds(5));
Assert.False(receiveTask.IsFaulted); // [[A]]
}
}
finally
{
tokenSource.Cancel();
}
}
当消息处理程序MessageReceived
中的一个断言失败时,它不会给出正确的错误消息。控制台显示它导致ThreadAbortException
。事实上,在插入标有 A 的行之前,测试甚至在成功时完成,忽略了消息处理程序中的错误。
那么我怎样才能改变这一点,我得到正确的错误消息,如与预期不匹配... ?有没有办法让另一个线程(这里是receiveTask
)中的错误处理正确的单元测试失败?
将
if (receiveTask.Exception != null) throw receiveTask.Exception;
是正确的方法吗?
另外我注意到当我在try-finally
内使用MessageReceived
以便测试不能等待完全超时(messageReceived.Set()
)时,任务本身不会出现故障而不会出现故障有一个例外。所以我不确定这是一种可行的方法。