我有一些旧的代码,我正在尝试编写测试。代码解析日志文件(在后台线程上),并在完成时触发传入的委托。
即
<button id="btn" title="this is a div" disabled>Search</button>
代码是生产代码,并且每件事都运行正常并且已经做了很长时间,但是当我尝试测试它时,我得到了“线程被中止”。 Thread_ParseLog方法中引发的异常。
测试如下:
public delegate void finread(LogData l, LRParseState l, string e="");
void Thread_ParseLog(object info) {
var info = ti as ThreadInfo;
// some time later
info.fin(log, state, error);
}
public static void ParseErrorLog(string log, finread fin){
var pts = new ParameterizedThreadStart(Thread_ParseLog);
new Thread(pts).Start(new ThreadInfo(log, fin));
}
测试数据很大,大约55mb,正常处理大约需要500ms。
我也在输出窗口中出错:
抛出异常:'System.Threading.ThreadAbortException'中 mscorlib.dll System.AppDomainUnloadedException:试图访问 卸载AppDomain。如果测试启动了一个线程,就会发生这种情况 但没有阻止它。确保所有线程都由 测试在完成前停止。
这似乎指出某种线程同步问题,但我无法对我正在测试的代码做些什么。
显然,这是我编写测试的方式,我可以通过更改测试来修复它,但我不确定它为什么会发生。
TIA。
答案 0 :(得分:2)
使用同步机制(例如ManualResetEvent
)等待测试的异步部分在离开测试方法之前完成。
[TestMethod]
public void Create_LogReader_Big_Log() {
// Use this event to wait until the asynchronous code has been executed
// before leaving the test method
ManualResetEvent resetEvent = new ManualResetEvent(false);
LogData logDataReceived = null;
llt(ERROR_LOG, (log, state) => {
logDataReceived = log;
// Signal that the test has reached the end
resetEvent.Set();
});
// Wait for the event to be set
resetEvent.WaitOne();
// Additionally wait for a grace period to allow the other thread to fully terminate
Thread.Sleep(500);
// Now perform the asserts on the received data
Assert.IsTrue(logDataReceived != null);
}
答案 1 :(得分:1)
使用异步测试方法并给它一个小延迟来运行。
[TestMethod]
public async Task Create_LogReader_Big_Log()
{
llt(ERROR_LOG, (log, state) => {
Assert.IsTrue(log != null); // never get here!
});
await Task.Delay(3000);
}