Skip to content

Commit 9e7eac7

Browse files
authored
Fix RxSchedulers not being set by ReactiveUI.Testing SchedulerExtensions (#4184)
1 parent e3ed43d commit 9e7eac7

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Copyright (c) 2025 .NET Foundation and Contributors. All rights reserved.
2+
// Licensed to the .NET Foundation under one or more agreements.
3+
// The .NET Foundation licenses this file to you under the MIT license.
4+
// See the LICENSE file in the project root for full license information.
5+
6+
using System.Collections.Generic;
7+
using Microsoft.Reactive.Testing;
8+
using NUnit.Framework;
9+
10+
namespace ReactiveUI.Testing.Tests;
11+
12+
/// <summary>
13+
/// Tests for <see cref="SchedulerExtensions"/>.
14+
/// </summary>
15+
[TestFixture]
16+
public sealed class SchedulerExtensionTests
17+
{
18+
/// <summary>
19+
/// Tests that WithScheduler sets both RxApp and RxSchedulers schedulers.
20+
/// </summary>
21+
[Test]
22+
public void WithScheduler_ShouldSetBothRxAppAndRxSchedulersSchedulers()
23+
{
24+
var testScheduler = new TestScheduler();
25+
var originalMainThread = RxApp.MainThreadScheduler;
26+
var originalTaskpool = RxApp.TaskpoolScheduler;
27+
var originalRxSchedulersMain = RxSchedulers.MainThreadScheduler;
28+
var originalRxSchedulersTask = RxSchedulers.TaskpoolScheduler;
29+
30+
using (SchedulerExtensions.WithScheduler(testScheduler))
31+
{
32+
// Verify schedulers
33+
using (Assert.EnterMultipleScope())
34+
{
35+
// Verify RxApp schedulers are set
36+
Assert.That(RxApp.MainThreadScheduler, Is.EqualTo(testScheduler));
37+
Assert.That(RxApp.TaskpoolScheduler, Is.EqualTo(testScheduler));
38+
39+
// Verify RxSchedulers are set
40+
Assert.That(RxSchedulers.MainThreadScheduler, Is.EqualTo(testScheduler));
41+
Assert.That(RxSchedulers.TaskpoolScheduler, Is.EqualTo(testScheduler));
42+
}
43+
}
44+
45+
// Verify schedulers are restored after disposal
46+
using (Assert.EnterMultipleScope())
47+
{
48+
Assert.That(RxApp.MainThreadScheduler, Is.EqualTo(originalMainThread));
49+
Assert.That(RxApp.TaskpoolScheduler, Is.EqualTo(originalTaskpool));
50+
Assert.That(RxSchedulers.MainThreadScheduler, Is.EqualTo(originalRxSchedulersMain));
51+
Assert.That(RxSchedulers.TaskpoolScheduler, Is.EqualTo(originalRxSchedulersTask));
52+
}
53+
}
54+
}

src/ReactiveUI.Testing/SchedulerExtensions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,20 @@ public static IDisposable WithScheduler(IScheduler scheduler)
3232
_schedulerGate.WaitOne();
3333
var prevDef = RxApp.MainThreadScheduler;
3434
var prevTask = RxApp.TaskpoolScheduler;
35+
var prevRxDef = RxSchedulers.MainThreadScheduler;
36+
var prevRxTask = RxSchedulers.TaskpoolScheduler;
3537

3638
RxApp.MainThreadScheduler = scheduler;
3739
RxApp.TaskpoolScheduler = scheduler;
40+
RxSchedulers.MainThreadScheduler = scheduler;
41+
RxSchedulers.TaskpoolScheduler = scheduler;
3842

3943
return Disposable.Create(() =>
4044
{
4145
RxApp.MainThreadScheduler = prevDef;
4246
RxApp.TaskpoolScheduler = prevTask;
47+
RxSchedulers.MainThreadScheduler = prevRxDef;
48+
RxSchedulers.TaskpoolScheduler = prevRxTask;
4349
_schedulerGate.Set();
4450
});
4551
}

0 commit comments

Comments
 (0)