Question

I am attempting to see if the results of a view model are performing the correct actions.

My observables are setup as follows:

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);
}

Then further down I have

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);
}

In my test, I am running the test schedular and advancing it, however, I am getting the PerformFilter performing at different times than I expect

eg my test is:

(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);

});

How do I make the tester more predictable?

I am running ReactiveUI 5.5.1 and in a XAML application.

Was it helpful?

Solution

Your Throttle doesn't set a scheduler, this is a classic TestScheduler mistake

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top