Я принимаю код от ReactiveUi website documentation и пытаюсь выполнить его тестирование, но он не работает.
Речь идет о вызове команды для отмены другого.ReactiveUI - Отменить команду от другого - Не удалось выполнить тестирование кода из документации
Ниже приведен тест.
public class SomeViewModel : ReactiveObject
{
public SomeViewModel(IScheduler scheduler)
{
this.CancelableCommand = ReactiveCommand
.CreateFromObservable(
() => Observable
.StartAsync(DoSomethingAsync)
.TakeUntil(CancelCommand), outputScheduler: scheduler);
this.CancelCommand = ReactiveCommand.Create(
() =>
{
Debug.WriteLine("Cancelling");
},
this.CancelableCommand.IsExecuting, scheduler);
}
public ReactiveCommand<Unit, Unit> CancelableCommand
{
get;
private set;
}
public ReactiveCommand<Unit, Unit> CancelCommand
{
get;
private set;
}
public bool IsCancelled { get; private set; }
private async Task DoSomethingAsync(CancellationToken ct)
{
try
{
await Task.Delay(TimeSpan.FromSeconds(3), ct);
}
catch (TaskCanceledException)
{
IsCancelled = true;
}
}
}
А вот тест блок:
[TestFixture]
[Category("ViewModels")]
public class SomeViewModelFixture
{
public async Task Executing_cancel_should_cancel_cancelableTask()
{
var sut = new SomeViewModel(Scheduler.Immediate);
var t = sut.CancelableCommand.Execute();
await sut.CancelCommand.Execute();
await t;
Assert.IsTrue(sut.IsCancelled);
}
}
CancelCommand
является excuted (контрольная точка на бревне консоли ударил) однако Task.Delay
никогда не отменяется. Кажется TakeUntil
не просит отмены.
UPDATE
Я редактировал код выше, так что мой ViewModel
т е р принимает IScheduler
и создавать команды с ним в соответствии с that issue about unit testing но тест по-прежнему не удается.
Я пробовал как nUnit, так и xUnit.
Я также попытался сделать RxApp.MainThreadScheduler = Scheduler.Immediate
в моей тестовой настройке согласно that article, но все еще не удается.
UPDATE2
Из решения, что я отметил в качестве ответа и комментариев, проще всего не использовать IScheduler в CTOR, а затем написать тест, как и что она проходит.
[Test]
public async Task Executing_cancel_should_cancel_cancelableTask()
{
var sut = new SomeViewModel();
sut.CancelableCommand.Execute().Subscribe();
await sut.CancelCommand.Execute();
Assert.IsTrue(sut.IsCancelled);
}
Возможно, вам нужно взглянуть на использование тестового бегуна, который не отложен. Быстрый поиск нашел эту статью, которая может помочь. http://putridparrot.com/blog/unit-testing-a-reactiveui-viewmodel/ – kenny
Tks но: i) Я не совсем понимаю ii) RxApp не обладает свойством aDeferredScheduler ii) в статье автор говорит, что реактивное устройство обнаруживало тестировщики и выполняли переключатель планировщика. –
DeferredScheduler был переименован в MainThreadScheduler. Я сделал это планировщиком Immediate, но тест по-прежнему терпит неудачу. Я использую NUnit. Попробуем с xUnit. –