我在使用 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
方法。
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
来完成它。