[WIP] Stabilize ReactiveUI.Tests by isolating static state and de-parallelizing affected tests #4166
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Thanks for assigning this issue to me. I'm starting to work on it and will keep this PR's description up to date as I form a plan and make progress.
Original issue description:
Original prompt
This section details on the original issue you should resolve
<issue_title>Stabilize ReactiveUI.Tests by isolating static state and de-parallelizing affected tests</issue_title>
<issue_description>Goal: Make tests deterministic. Audit tests for usage of static/global state and ensure each such test:
This work is blocked unless the build & test environment is set up exactly as specified below. Follow the pre-flight steps first.
🔒 Pre-flight: Build Environment Requirements (must be completed before any code changes)
Cloning the Repository
CRITICAL: Perform a full, recursive clone. A shallow clone (
--depth 1) will fail because the build reads git version info.Required Tools
CRITICAL: Install all three SDKs via the official script:
(Tip: ensure
./.dotnetis on PATH for this shell session, or call it explicitly via./.dotnet/dotnet.)Solution Files
src/ReactiveUI.slnintegrationtests/(not required for this task)🛠️ Build & Test Commands (Windows PowerShell or CMD, repository root)
CRITICAL:
dotnet workload restoremust be run from/srcbefore building.Note: Building on Linux/macOS will fail due to
net*-windowstargets and AOT tests. Use Windows.🧭 Context & Example Failure
We’re seeing intermittent failures tied to static/global state. Example:
This indicates tests mutate or rely on global/static state (e.g.,
RxApp, service locator, schedulers, message bus, etc.) without restoring it. Running in parallel amplifies the flakiness.✅ What to do
1) Discover tests that touch static/global state
Search for usages of well-known static entry points or singletons anywhere under
src/ReactiveUI.Tests:RxApp.,MessageBus.,SuspensionHost.,Interaction.,ModeDetector.,LogHost.Locator.,Locator.Current,Locator.CurrentMutable,DependencyResolver,Splat.Locatorstaticmembers that mutate shared state (caches, registries, global flags, default schedulers, etc.)Suggested queries (run at repo root):
Output: Build a checklist of test files and specific tests that read or write static/global state.
2) Make affected tests non-parallelizable (targeted)
For each test fixture or test that touches static/global state, explicitly disable parallelization with NUnit:
At the fixture level (preferred when multiple tests in a class touch static state):
Or at the individual test level if only one or two tests are affected:
Do not disable parallelization assembly-wide. Keep the scope as tight as possible.
3) Introduce helper scopes to snapshot & restore static state
Create small, focused disposable scopes for each area of static state. These should snapshot on construction, and restore on
Dispose(). Use them inSetUp/TearDownor inusingblocks inside tests.💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.