Я использую xUnit и ReactiveUI 11.2 (для WPF,. NET Framework 4.8, но я думаю, что мой вопрос более обобщенный c).
По сути, я хочу проверить свой ReactiveCommand
в моделях представления.
Например, было какое-то условие, которое вызвало исключение в моем коде, и моя программа вылетает.
Я хочу сделать модульный тест, чтобы воспроизвести эту ошибку (модульный тест должен потерпеть неудачу) Затем я исправлю свою ошибку, как-то исключу исключение, и тогда мой тест должен пройти, чтобы отразить исправление. (довольно стандартная процедура).
Проблема в том, что любое исключение, выдаваемое во время ReactiveCommand, кажется "проглоченным" ReactiveUI, исключение не приводит к сбою теста .
Кроме того, то же самое происходит, если я пытаюсь написать Assert()
операторы в обратном вызове .Subscribe()
: во время отладки я вижу, что мое утверждение не выполняется должным образом, но тест в любом случае помечается зеленым как «пройдено».
Я попробовал другой способ, немного поиграв с планировщиками, ничего не улучшилось. Я пытался использовать .ThrownExceptions, как описано, тоже не помогает.
Некоторая документация здесь: https://reactiveui.net/docs/handbook/testing/
TL; DR
Как я могу сделать исключения в моих ReactiveCommand
s, чтобы мои модульные тесты не проходили? Как я должен провести модульные тесты ReactiveCommand
с?
Ниже приведена полная программа, демонстрирующая проблему.
Использование с пакетами NuGet: xunit 2.4.1, xunit.runner.visualstudio 2.4.1, ReactiveUI.Testing 11.2.1
using Microsoft.Reactive.Testing;
using ReactiveUI;
using ReactiveUI.Testing;
using System;
using System.Reactive;
using System.Reactive.Concurrency;
using System.Reactive.Linq;
using Xunit;
namespace Tests
{
public class Foo
{
public ReactiveCommand<Unit, Unit> TestCommand { get; }
public Foo(IScheduler? scheduler = null)
{
scheduler ??= RxApp.MainThreadScheduler;
TestCommand = ReactiveCommand.Create(Explode, canExecute: null, outputScheduler: scheduler);
}
public void Explode()
{
throw new Exception("Boom");
}
}
public class ReactiveCommandTests
{
// Should fail? (it doesn't fail)
[Fact]
public void Test1()
{
var foo = new Foo();
foo.TestCommand.Execute().Subscribe();
}
// Should fail (it fails alright ! no ReactiveUI Observable here...)
[Fact]
public void Test2()
{
var foo = new Foo();
foo.Explode();
}
// Should fail? (it doesn't fail)
[Fact]
public void Test3()
{
var testScheduler = new TestScheduler();
var foo = new Foo(testScheduler);
foo.TestCommand.Execute().Subscribe();
}
// Should fail? (it doesn't fail)
[Fact]
public void Test4()
{
new TestScheduler().With(scheduler =>
{
var foo = new Foo(scheduler);
foo.TestCommand.Execute().Subscribe();
});
}
// Should fail ? (it doesn't fail)
[Fact]
public void Test5()
{
var foo = new Foo();
foo.TestCommand.ThrownExceptions.Subscribe(
(ex) => {
Console.WriteLine("Exception detected !");
Assert.False(true); // This is hit, but doesn't even make the test fail....
});
foo.TestCommand.Execute().Subscribe();
}
}
}
Все тесты вызывают исключение, все тесты должны провалиться IMO, но только один , не использующий , `ReactiveCommand терпит неудачу.