나는 호출하고있는 객체로부터 이벤트를 받기를 기대하는 테스트를 작성하고있다. 특히, 오픈 소스 Granados 프로젝트를 사용하여 SSH를 통해 AIX 시스템에 연결하는 객체를 호출 한 다음 연결을 끊고 연결 해제 중에 발생하는 OnConnectionClosed 이벤트를 수신하고 싶습니다. 그것은 아주 간단하게 들리지만 나는 과거에 이렇게 많은 테스트를 작성했지만, 이번에는 스레딩과 관련이 있다고 생각되는 이상한 행동이 일어나고 있습니다.다른 스레드에서 발생시킬 이벤트를 수신하는 MSTest 유닛 테스트를 작성하는 방법은 무엇입니까?
기본적으로 내가 호출하는 객체는 내가 호출 한 것과 다른 스레드에서 'OnConnectionClosed'이벤트를 발생시키고 있습니다. 내가보기 엔 UI에서 'Debug Test'를 선택하여 테스트를 실행하면 통과하지만 'Run Test'를 선택하면 디버그 실행 중 중단 점이 설정되지 않은 경우에도 실패합니다. 내가 검색 좀 해봤으며 기본적으로 MSTest 호스트가 단일 스레드 모드에서 실행되지만 구성 변경으로 인해 다중 스레드 모드에서 실행될 수 있다는 것을 나타내는 것으로 보이는 this post을 발견했습니다. 이것은 논리적으로 내 문제를 해결하는 것처럼 들리 겠지만 물론 그렇지 않습니다.
다른 게시물들 나는 또한 MSTest가 단순히 백그라운드 스레드를 모니터링하지 않는다고 생각하게 만듭니다. (그래서 그들에 의해 제기 된 이벤트는 '들었습니다'). 이것은 또한 이해가 될 것이고, 디버그 모드에서 작동하는 것 같고 위의 수정이 논리적으로이 문제를 해결해야하는 것처럼 보입니다. 그런 다음 왜 작동하지 않는지 혼란 스럽습니다. 디버그 모드에서 여전히 문제가 있다고 생각할지라도 스레드를 제대로 처리하지 못하는 것일 수 있습니다.
비슷한 방식으로 다른 사람이 뭔가를 시도한 적이 있습니까? 그렇다면 비슷한 문제가 발생 했습니까? 그렇다면 어떻게 해결 했습니까?
아래 관련 단위 테스트 코드를 붙여 넣었습니다 (보안상의 이유로 연결 정보가 삭제되었습니다).
[TestClass]
public class SSHReaderTests
{
private bool received = false;
private delegate bool SimpleFunc();
[TestInitialize]
public void MyTestInitialize()
{
received = false;
}
[TestMethod]
public void Should_raise_OnReaderConnectionClosed_event_after_successful_connection_is_disconnected()
{
IReader reader = new SSHReader();
reader.OnReaderConnectionClosed += delegate
{
received = true;
};
reader.Connect("*****", "*****", "*****");
//Assert.IsTrue(reader.IsConnected);
reader.Disconnect();
//Assert.IsFalse(reader.IsConnected);
Assert.IsTrue(WaitUntilTrue(delegate {
return received; }, 30000, 1000));
}
private static bool WaitUntilTrue(SimpleFunc func, int timeoutInMillis, int timeBetweenChecksInMillis)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while(stopwatch.ElapsedMilliseconds < timeoutInMillis)
{
if (func())
return true;
Thread.Sleep(timeBetweenChecksInMillis);
}
return false;
}
}