2014-11-24 49 views
0

我運行一個Windows窗體應用程序需要更新的GUI,因此使用的是來自當前同步上下文調度。代碼:TaskScheduler.FromCurrentSynchronizationContext()改變從TaskScheduler.FromCurrentSynchronizationContext()調度單元測試

在編寫單元測試時 - 這個調度程序需要切換,因爲我們想要使用我們自己的調度程序,在測試中同時運行並同步運行。有替代品(注射,ManualResetEvent),但這是醜陋的,我們不希望它。

可以通過使用反射來覆蓋私有變量來修改TaskScheduler.Default,這很好,但是對於TaskScheduler.FromCurrentSynchronizationContext()沒有明顯的做法。

那麼,你如何做到這一點?

+2

依賴注入如何醜陋?至少對我來說這聽起來很荒謬。對我來說,這聽起來是你想要實現的(反射來覆蓋一個私有變量)是什麼醜陋的。更好的方法是注入一個返回調度程序的工廠,或者注入調度程序本身。 – 2014-11-24 08:37:04

+0

你說DI很奇怪,但你寧願用反射來提取一個類中的私有變量?我認爲你有它混合:) – 2014-11-24 09:02:44

+0

是的好吧,我提到的醜陋的事情是ManualResetEvent。注入確實看起來不錯,但實際的問題仍然存在:如何在TaskScheduler.FromCurrentSynchronizationContext()中更改Scheduler? – imbageek 2014-11-24 10:05:11

回答

2

在單元測試場景中可能有效的一件事是創建一個從SynchronizationContext繼承的TestSynchronizationContext,並將其分配爲SynchronizationContext.SetSynchronizationContext()。您的TestSynchronizationContext類將覆蓋Post方法,而不是重定向到Send方法,導致它同步運行。

你可以找到來源here作爲參考。

+0

偉大的人。這正是我正在尋找的。 – imbageek 2014-11-25 07:59:39

+0

Omg。我不能在這裏格式化我的答覆,但這裏的代碼不使用線程池的工作SyncContext: '公共類InvokeNowSynchronizationContext:的SynchronizationContext { 公共覆蓋無效後(SendOrPostCallback d,對象的狀態){ d。調用(狀態); } public override void發送(SendOrPostCallback d,對象狀態)d.Invoke(state); } }' – imbageek 2014-11-25 08:02:02