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 응용 프로그램을 실행하고 있습니다.
지금 명령을 트리거링 및 RegisterAsyncTask() 안에있는 코드를 실행하는 TestScheduler으로 예측 가능한 결과를 얻고있다
Throttle
스케줄러를 설정하지 않습니다 당신의 ObservableAsPropertyHelper가 새로운 가치를 얻고 있습니다. 거기에 특별한 것이 필요합니까? –RxUI 5.x ToProperty가 예약되어 있으므로 스케줄러를 한 번 더 실행해야 할 수 있습니다 –