gpt4 book ai didi

c# - 使用本地线程的单元测试方法

转载 作者:行者123 更新时间:2023-11-30 13:51:32 25 4
gpt4 key购买 nike

我有一个看起来像这样的方法:

protected void OnBarcodeScan(BarcodeScannerEventArgs e)
{
// We need to do this on a seperate thread so we don't block the main thread.
ThreadStart starter = () => SendScanMessage(e, _scanDelegates);
Thread scanThread = new Thread(starter);

scanThread.Start();
}

然后线程关闭并执行一些逻辑(并最终在我的测试中调用委托(delegate))。

我的问题是我的单元测试在线程完成之前完成。所以我的测试失败了。

我可以只添加 System.Threading.Thread.Sleep(1000); 并希望逻辑永远不会超过一秒(它不应该)。但这似乎是一个 hack。

问题是我不想将该线程暴露给外界,甚至不想暴露给类(class)的其他人。

是否有一些很酷的方法可以再次找到该线程并在我的单元测试中等待它?

像这样:

[TestMethod]
[HostType("Moles")]
public void AddDelegateToScanner_ScanHappens_ScanDelegateIsCalled()
{
// Arrange
bool scanCalled = false;
MCoreDLL.GetTopWindow = () => (new IntPtr(FauxHandle));

// Act
_scanner.AddDelegateToScanner(_formIdentity, ((evnt) => { scanCalled = true; }));
_scanner.SendScan(new BarcodeScannerEventArgs("12345678910"));

// This line is fake!
System.Threading.Thread.CoolMethodToFindMyThread().Join();

// Assert
Assert.IsTrue(scanCalled);
}

CoolMethodToFindMyThread 方法显然是我编造的。但是有什么理由要这样做吗?

最佳答案

所以如果我理解这是如何工作的,那么你注册的委托(delegate)就是在第二个线程上被调用的委托(delegate),对吧?在这种情况下,您可以在测试和被调用的委托(delegate)中使用线程同步。我一直在单元测试中做这种事情。

像这样:

[TestMethod]
[HostType("Moles")]
public void AddDelegateToScanner_ScanHappens_ScanDelegateIsCalled()
{
// Arrange
var scanCalledEvent = new ManualResetEvent(false);
MCoreDLL.GetTopWindow = () => (new IntPtr(FauxHandle));

// Act
_scanner.AddDelegateToScanner(_formIdentity, ((evnt) => { scanCalledEvent.Set(); }));
_scanner.SendScan(new BarcodeScannerEventArgs("12345678910"));

// Wait for event to fire
bool scanCalledInTime = scanCalledEvent.WaitOne(SOME_TIMEOUT_IN_MILLISECONDS);

// Assert
Assert.IsTrue(scanCalledInTime);
}

在其中设置一些 超时很重要,否则如果出现问题,您的测试就会锁定,这很难调试。 WaitOne 将阻塞,直到事件被设置或超时到期,返回值告诉您发生了什么。

(警告:我的返回值可能是倒过来的——我不记得我的脑海里是否记得 true 表示事件已设置,或者 true 表示超时已过期。请查看文档。)

您可以在此处使用多种同步原语,具体取决于您要执行的操作。 ManualResetEvent 通常对我来说效果很好。

关于c# - 使用本地线程的单元测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4340849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com