Так что, если я понимаю, как это работает, то вы регистрируете делегатов, которые вызываются во втором потоке, верно?В этом случае вы можете использовать синхронизацию потоков в своем тесте и вызываемом делегате.Я делаю подобные вещи в своих модульных тестах все время.
Примерно так:
[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 обычно работает довольно хорошо для меня.