如何让NUnit测试等待线程完成?

问题描述 投票:0回答:1

我在使用 NUnit 测试类库时遇到以下问题

当我从控制台应用程序或其他项目调用此方法时,它可以正常工作 - 只要

listenerThread
正在运行,应用程序就会工作。

public void StartServer(string ListenOnIp, int port, string ServerPFXCertificatePath, string CertPassword, bool VerifyClients)
        {

            serverCert = new X509Certificate2(ServerPFXCertificatePath, CertPassword, X509KeyStorageFlags.PersistKeySet);
            listener = new TcpListener(IPAddress.Parse(ListenOnIp), port);
            Thread listenerThread = new Thread(() =>
            {
                listener.Start();
                int connected = 0;
                while (listener.Server.IsBound)
                {
                    TcpClient client = listener.AcceptTcpClient();
                    SSLClient connection = new SSLClient(client, serverCert, VerifyClients, this);                    
                }
                connected++;
            });
            listenerThread.Start();            
        }

但是,当我尝试从 NUnit 测试方法调用此方法时,它的行为就像启动并忘记任务 - 测试立即完成。

我尝试像这样包装 StartServer 方法

        [Test]
        public void Test()
        {
            Task.Run(() =>
            {
                server.StartServer(IPAddress.Any, 5000, $"{Workspace}\\{ServerWorkspace}\\Server.pfx", "123", false);
            }).Wait();
        }

我尝试了这样的标记测试方法 -

[Test,RequiresThread]
但没有结果

我可以将

StartServer
更改为任务,只需使用
Wait()
Wait()
来完成某些
TaskCompletionSource
,当
listenerThread
结束工作时即可完成, 但我想知道是否有更好的方法,最好不需要修改
StartServer
方法。

c# multithreading nunit tcplistener sslstream
1个回答
0
投票

Thread
ctor 创建所谓的前台线程,它将阻止应用程序退出,直到完成为止。 NUnit 似乎以某种方式忽略了它。解决此问题的一种方法是返回线程并在测试中调用
Join

public Thread StartServer(string ListenOnIp, int port, string ServerPFXCertificatePath, string CertPassword, bool VerifyClients)
{
    // ...
    listenerThread.Start();    
    return listenerThread;
}

在测试中:

[Test]
public void Test()
{
    var thr = server.StartServer(IPAddress.Any, 5000, $"{Workspace}\\{ServerWorkspace}\\Server.pfx", "123", false);
    thr.Join();
}

其他选项是从服务器添加一些信号机制。或者返回

Task
并使用
TaskCompletionSource
来完成它。

© www.soinside.com 2019 - 2024. All rights reserved.