带回调的xUnit测试(其他线程)吞下异常

时间:2017-03-13 09:41:41

标签: c# multithreading unit-testing xunit

我得到了一个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())时,任务本身不会出现故障而不会出现故障有一个例外。所以我不确定这是一种可行的方法。

0 个答案:

没有答案