2011-11-22 6 views
0

나는 프로젝트에서 Rx와 좀더 구체적으로 ReactiveUI를 사용 해왔다. 나는 약간의 조언이 필요한 상황에 처해있다.ReactiveUI MessageBus와 MessageBox가 결과로

문제는 명령이 실행되면 (버튼을 클릭 한 경우) 사용자가 예 또는 아니오로 대답 할 메시지 상자를 표시하고 싶습니다. 대답에 따라 좀 더하고 싶습니다. 물건. 유닛 테스트에서 MVVM을 사용할 때 MessageBox를 테스트 할 수 있기를 원합니다. 즉 다른 코드로 대체 될 수 있습니다. 이것은 본질적으로 내가 가진 것입니다.

내보기 모델에서

:

this.ExternalObservable = this.SomeOperationCommand 
      .SelectMany(_ => this.UserWantsToContinueWithOperation()) 
      .Where(x => x) 
      .Select(_ => this.SomeData) 
      .Where(x => x != null); 

private IObservable<bool> UserWantsToContinueWithOperation() { 
     var subject = new Subject<bool>(); 

     var box = new GuiMsgBox("Continue?", 
      result => { 
       subject.OnNext(result == System.Windows.MessageBoxResult.Yes); 
      }); 

     MessageBus.Current.SendMessage(box); 

     return subject; 
    } 

그리고 GuiMsgBox는 기본적으로 나는 UI에서 MessageBus를 사용하여 내 테스트에서 듣는 System.Windows.MessageBox 클래스 래퍼입니다.

응용 프로그램을 실행할 때이 모두가 정상적으로 작동하지만 단위 테스트에서 버스가 즉시 스케줄러를 사용하기 때문에 분명히 같은 방식으로 작동하지 않습니다.

실제 문제에 대한 입력이 있으므로 여기에 몇 가지 디자인 결함이 있다고 느낍니다. 테스트 할 수있는 결과를 반환하는 메시지 상자를 표시하면 크게 감사하겠습니다!

답변

1

더 자세한 구현 정보가 없어도 알기 어렵지만 대신 TestScheduler를 사용하는 것이 좋습니다.

여기 https://github.com/xpaulbettsx/ReactiveUI/blob/master/ReactiveUI.Sample/ReactiveUI.Sample.Tests/ViewModels/BlockTimerViewModelTest.cs

가 MVVM의 또 다른 좋은 예입니다 : 여기

(new TestScheduler()).With(sched => { 
    // Write your test here, all the schedulers will be 
    // implicitly set to your 'sched' scheduler. 
}); 

이 포모 도로 타이머 테스트, MVVM 관련 테스트 한 무리의 예 :로 RxUI.Testing,이는 간단합니다 입력을 조롱하기 위해 특별히 CreateColdObservable을 사용 (플러그 미안) 기반의 테스트 from my Rx book,

,321 (즉,의 시나리오를 테스트는 "결과를 확인, 버튼을 클릭 한 다음 10 초 후에") 0

+0

좋은 생각, 나는이 특별한 문제에 대해'TestScheduler'를 시도 할 것입니다. 대화 상자에서 결과를 가져 오는 방법에 대해 어떻게 생각합니까? ReactiveUI를 사용할 때 어떻게합니까? 나는 MessageBus가 즉각적인 것이 아니라 연기 된 것으로 생각한다. MVVMLight, 그렇지 않나요? – lbergnehr

관련 문제