2014-04-21 3 views
0

뷰 모델의 결과가 올바른 작업을 수행하는지 확인하려고합니다.ReactiveUI 테스팅

public FilterBoxViewModel() 
    { 
     var asyncFilterResults = this.filterItemsCommand.RegisterAsyncTask(x => this.PerformFilter(x as string)); 

     this.filteredItems = new ObservableAsPropertyHelper<IEnumerable<IFilterBoxItem>>(asyncFilterResults, _ => this.RaisePropertyChanged("FilteredItems")); 

     this.WhenAnyValue(x => x.SearchTerm) 
      .Throttle(TimeSpan.FromMilliseconds(50)) 
      .Skip(1) 
      .Subscribe(this.filterItemsCommand.Execute); 
    } 

을 그리고 더 아래 나는, 나는 내가 무엇입니까하지만, 내 테스트에서

private async Task<IEnumerable<IFilterBoxItem>> PerformFilter(string searchTerm) 
    { 
     if (string.IsNullOrWhiteSpace(searchTerm)) 
     { 
      return Enumerable.Empty<IFilterBoxItem>(); 
     } 

     // Perform getting the items on the main thread and async await the results. 
     // This is provide a immutable version of the results so we don't cause 
     // threading issues. 
     var items = await Observable.Start(
      () => this.FilterBoxManager.RootElements.GetAllItemsEnumerable().ToList().Select(x => new { Name = x.Name, Item = x }), RxApp.MainThreadScheduler); 

     return 
      items.Where(x => x.Name.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0) 
       .Select(x => x.Item); 
    } 

테스트 schedular을 실행하고 발전하고있다 : 다음과 같이

내 관찰 가능한이 설정되어 PerformFilter는 예상보다 다른 시간에 수행합니다.

예 : 내 테스트 :

 (new TestScheduler()).With(scheduler => 
     { 
      var viewModel = new FilterBoxViewModel(); 

      var testManager = new TestManager { RootElements = this.sampleItems }; 

      viewModel.FilterBoxManager = testManager; 

      viewModel.SearchTerm = "folder"; 

      scheduler.AdvanceBy(TimeSpan.FromMilliseconds(51).Ticks); 

      Assert.AreEqual(viewModel.FilteredItems.Select(x => x.Name), folderSearchResults); 

      viewModel.SearchTerm = "apple"; 

      Assert.AreEqual(viewModel.FilteredItems.Select(x => x.Name), appleSearchResults); 

     }); 

테스터의 예측 가능성을 높이려면 어떻게해야합니까?

ReactiveUI 5.5.1 및 XAML 응용 프로그램을 실행하고 있습니다.

답변

1

이 내가지고 있지 않다, 그러나 고전 TestScheduler 실수

+0

지금 명령을 트리거링 및 RegisterAsyncTask() 안에있는 코드를 실행하는 TestScheduler으로 예측 가능한 결과를 얻고있다 Throttle 스케줄러를 설정하지 않습니다 당신의 ObservableAsPropertyHelper가 새로운 가치를 얻고 있습니다. 거기에 특별한 것이 필요합니까? –

+1

RxUI 5.x ToProperty가 예약되어 있으므로 스케줄러를 한 번 더 실행해야 할 수 있습니다 –

관련 문제