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

标签 c# multithreading nunit tcplistener sslstream

我在使用 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 更改为 Task,然后对某些 TaskCompletionSource 使用 Wait()Wait()当listenerThread结束工作时完成, 但我想知道是否有更好的方法,最好不需要修改 StartServer 方法。

最佳答案

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 来完成它。

关于c# - 如何让 NUnit 测试等待线程完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76912151/

相关文章:

c# - 浮点精度可以依赖于线程吗?

c# - 无法创建变量类型 'Item' 的实例,因为它没有 new() 约束

c# - 滚动问题

multithreading - 从后台线程更新 NSTableView 数据源

java - 如何在Project Reactor中正确使用Schedulers.single()?

c# - Resharper 忽略用于使用分析的单元测试

c# - 使用新文件更新文件

python - CPU 为 100% 用于多处理队列以从多个摄像机获取帧

c# - 如何使用 ITestFilterService 和/或 ITestFilterBuilder 以编程方式为 NUnit 3 创建自定义过滤器

c# - 什么是好的、免费的 C# 单元测试覆盖工具?