2014-11-24 2 views
0

GUI를 업데이트해야하는 Windows Forms 응용 프로그램을 실행 중이므로 이 있으면 현재 동기화 컨텍스트에서 오는 스케줄러를 사용할 수 있습니다. 코드 : TaskScheduler.FromCurrentSynchronizationContext()단위 테스트를 위해 TaskScheduler.FromCurrentSynchronizationContext()에서 스케줄러를 변경하십시오.

단위 테스트를 작성할 때 테스트에서 동시에 및 동 기적으로 실행되는 자체 스케줄러를 사용하기 때문에이 스케줄러를 전환해야합니다. 대안 (injection, ManualResetEvent)이 있지만 추한 것이고 우리는 원하지 않습니다.

리플렉션을 사용하여 개인 변수를 덮어 쓰면 TaskScheduler.Default를 수정할 수 있습니다. 그렇지만 TaskScheduler.FromCurrentSynchronizationContext()를 사용하여 동일한 작업을 수행하는 분명한 방법은 없습니다.

그래서 어떻게 할 수 있습니까?

+2

어떻게 의존성 주입이 못생긴가? 적어도 나에게는 어리석은 소리가 난다. 나를 위해 그것은 당신이 달성하려고하는 소리 (개인 변수를 덮어 쓴다는 반영)은 못생긴 것이다. 더 나은 방법은 스케쥴러를 반환하거나 스케쥴러 자체를 삽입하는 팩토리를 삽입하는 것입니다. –

+0

당신은 DI weird를 호출하지만, 반대로 리플렉션을 사용하여 클래스 내에서 개인 변수를 추출 할 수 있습니까? 나는 당신이 그것을 가지고 있다고 생각한다. :) –

+0

그래, 내가 언급 한 추악한 것은 ManualResetEvent였다. 주입은 확실히 멋지지만 실제 질문은 남아 있습니다 : TaskScheduler.FromCurrentSynchronizationContext()에서 스케줄러를 어떻게 변경합니까? – imbageek

답변

2

단위 테스트 시나리오에서 작동 할 수있는 한 가지는 SynchronizationContext을 상속하는 TestSynchronizationContext을 만들고 SynchronizationContext.SetSynchronizationContext()으로 지정하는 것입니다. TestSynchronizationContext 클래스는 Post 메서드를 재정 의하여 대신 Send 메서드로 리디렉션하여 동기식으로 실행합니다.

참조 용으로 here 소스를 찾을 수 있습니다.

+0

좋은 사람. 이것은 내가 찾고 있었던 바로 그 것이었다. – imbageek

+0

mg. 나는 여기에 내 대답을 포맷 할 수 모르겠지만, 여기에 작품에 대한 스레드 풀을 사용하지 않는 SyncContext에 대한 코드입니다 : '공용 클래스 InvokeNowSynchronizationContext : SynchronizationContext에 { 공공 재정의 무효 포스트 (SendOrPostCallback d를, 객체 상태) { D를. 호출 (상태); } public override void Send (SendOrPostCallback d, 개체 상태) { d.Invoke (state); } }' – imbageek

관련 문제