2013-02-28 82 views
0

我曾經的代碼在我的Windows 8商店應用下列位:CoreDispatcher與反應擴展單元測試

public static void ConvertUpdateStreamToCollection<T>(this IObservable<UpdateInfo<T>> input, ObservableCollection<T> list) 
    { 
     input 
      .ObserveOnDispatcher() 
      .Subscribe(upInfo => UpdateList(upInfo, list)); 
    } 

這ObserveOnDispatcher是公元前存在這通常會在後臺線程中調用,當它更新可觀察列表時,我將需要它在UI調度器上。第一次訂購這看起來像它運行良好時,我運行的應用程序。

但我想用單元測試來測試它。我正在使用內置的MSTest。 ObserveOnDispatcher拋出,但是,抱怨沒有有效的窗口從哪裏得到一個CoreDispatcher。

我在堆棧溢出的其他地方看到了WPF的解決方法。但是這看起來只是讓調度員運行的東西。這個錯誤似乎更爲重要。有沒有已知的解決方法?

回答

2

(編輯:現在我有一個鍵盤,而不是手機上更好的格式化)

還有另一種方式來實現相同的功能:

.ObserveOnDispatcher() 

是相當等同於:

.ObserveOn(new DispatcherScheduler(Dispatcher.CurrentDispatcher)) 

現在,而不是那個DispatcherScheduler,有一個類似於:

public static class Schedulers 
{ 
    public static IScheduler Dispatcher {get; internal set;}  
} 

而變化用法:

.ObserveOn(Schedulers.Dispatcher) 

實施例:

void Main() 
{ 
    // For normal usage, we'll set this to the proper DispatcherScheduler 
    Schedulers.Dispatcher = new DispatcherScheduler(Dispatcher.CurrentDispatcher); 

    // Do stuff 
    new Thingy().DoStuff(); 

    // for testing usage, we'll set this to be the immediate scheduler 
    Schedulers.Dispatcher = Scheduler.Immediate; 

    // Do stuff 
    new Thingy().DoStuff(); 
} 

public class Thingy 
{ 
    public void DoStuff() 
    { 
     var query = Observable.Range(0, 10).ObserveOn(Schedulers.Dispatcher); 
     query.Subscribe(Console.WriteLine); 
    } 
} 
+0

感謝。你的帖子讓我意識到我可以看看Rx源代碼(https://rx.codeplex.com/SourceControl/changeset/view/7881e17c060b#Rx/NET/Source/System.Reactive.Windows.Threading/Reactive/Linq/ DispatcherObservable.cs)。 – Gordon 2013-03-02 09:15:08

+0

這裏有一個簡單的問題。你正在使用Dispatcher.CurrentDspatcher ...這是一個windows商店應用程序的整個生命是相同的事情?你會得到不同的與「窗口」對象相關的(默認情況下它們會得到它們)嗎? – Gordon 2013-03-02 09:16:23

+0

我想到的另一個解決方案是創建一個在測試模式下運行時變爲空操作的Shell ObserveOnMyDispatcher,以及在WD環境中運行時的「官方」ObserveOnDispatcher,因爲這樣可以避免Dispatcher在運行在WS應用程序... – Gordon 2013-03-02 09:17:41