Migrate Microsoft.AspNetCore.Watch.BrowserRefresh.Tests to MSTest.Sdk on MTP - #54725
Conversation
tmat
left a comment
There was a problem hiding this comment.
Why are we migrating away from XUnit?
There was a problem hiding this comment.
Pull request overview
Migrates additional SDK test projects from xUnit to MSTest.Sdk (on Microsoft.Testing.Platform), dropping the xUnit-coupled Microsoft.NET.TestFramework where it isn’t needed and updating assertions/attributes accordingly.
Changes:
- Add
MSTest.Sdktoglobal.jsonand gate the repo’s xUnit-specific test defaults behindUseMSTestSdk. - Convert several unit test projects (notably
Microsoft.AspNetCore.Watch.BrowserRefresh.Tests) to MSTest attributes/asserts and remove the TestFrameworkProjectReference. - Update
dotnet-watch.Teststo support Aspire integration tests (new helper + project reference + IVT).
Show a summary per file
| File | Description |
|---|---|
| global.json | Adds MSTest.Sdk msbuild SDK version pin. |
| test/Directory.Build.targets | Gates xUnit defaults behind UseMSTestSdk opt-out. |
| test/containerize.UnitTests/containerize.UnitTests.csproj | Switches project to MSTest.Sdk, removes TestFramework reference. |
| test/containerize.UnitTests/ParserTests.cs | Converts xUnit tests to MSTest attributes/asserts. |
| test/Microsoft.DotNet.ApiCompat.Tests/Microsoft.DotNet.ApiCompat.Tests.csproj | Switches project to MSTest.Sdk, removes TestFramework reference, adds MSTest global using. |
| test/Microsoft.DotNet.ApiCompat.Tests/RegexStringTransformerTests.cs | Converts xUnit tests to MSTest attributes/asserts. |
| test/Microsoft.DotNet.HotReload.Watch.Aspire.Tests/Microsoft.DotNet.HotReload.Watch.Aspire.Tests.csproj | Switches project to MSTest.Sdk, removes xUnit-coupled test utilities reference. |
| test/Microsoft.DotNet.HotReload.Watch.Aspire.Tests/AssertEx.cs | Adds a small local assertion helper to avoid TestFramework dependency. |
| test/Microsoft.DotNet.HotReload.Watch.Aspire.Tests/AspireServerLauncherCliTests.cs | Converts xUnit tests to MSTest attributes/asserts. |
| test/Microsoft.DotNet.HotReload.Watch.Aspire.Tests/AspireResourceLauncherCliTests.cs | Converts xUnit tests to MSTest attributes/asserts (incl. DataRow conversions). |
| test/Microsoft.DotNet.HotReload.Watch.Aspire.Tests/AspireHostLauncherTests.cs | Converts xUnit tests to MSTest attributes/asserts. |
| test/Microsoft.DotNet.HotReload.Watch.Aspire.Tests/AspireHostLauncherCliTests.cs | Converts xUnit tests to MSTest attributes/asserts. |
| src/Dotnet.Watch/Watch.Aspire/Properties/AssemblyInfo.cs | Adds InternalsVisibleTo for dotnet-watch.Tests. |
| test/dotnet-watch.Tests/dotnet-watch.Tests.csproj | Adds Watch.Aspire project reference needed by Aspire integration tests. |
| test/dotnet-watch.Tests/Aspire/AspireLauncherIntegrationTests.cs | Renames integration test class for clarity. |
| test/dotnet-watch.Tests/Aspire/PipeUtilities.cs | Adds new helper for reading Aspire status events via named pipes. |
| test/Microsoft.AspNetCore.Watch.BrowserRefresh.Tests/Microsoft.AspNetCore.Watch.BrowserRefresh.Tests.csproj | Switches BrowserRefresh test project to MSTest.Sdk, removes TestFramework reference. |
| test/Microsoft.AspNetCore.Watch.BrowserRefresh.Tests/ScriptInjectingStreamTests.cs | Converts xUnit tests to MSTest attributes/asserts and adjusts cancellation handling. |
| test/Microsoft.AspNetCore.Watch.BrowserRefresh.Tests/ResponseStreamWrapperCompressionTest.cs | Converts xUnit tests to MSTest attributes/asserts and string/sequence asserts. |
| test/Microsoft.AspNetCore.Watch.BrowserRefresh.Tests/HostingStartupTest.cs | Converts xUnit tests to MSTest attributes/asserts and resolves StringValues comparisons. |
| test/Microsoft.AspNetCore.Watch.BrowserRefresh.Tests/BrowserScriptMiddlewareTest.cs | Converts xUnit tests to MSTest attributes/asserts and expands Assert.Collection. |
| test/Microsoft.AspNetCore.Watch.BrowserRefresh.Tests/BrowserRefreshMiddlewareTest.cs | Converts xUnit tests to MSTest attributes/asserts and updates string containment checks. |
| test/Microsoft.AspNetCore.Watch.BrowserRefresh.Tests/BlazorWasmHotReloadMiddlewareTest.cs | Converts xUnit tests to MSTest attributes/asserts and sequence comparisons. |
Copilot's findings
- Files reviewed: 22/23 changed files
- Comments generated: 1
3f1079f to
77b601f
Compare
|
Re-validated this PR against the new Changes applied in the latest push on this branch: Other gotchas reviewed (no changes needed here):
Tests still pass locally on the bumped MSTest.Sdk. |
c1a2f7f to
6835289
Compare
Imports the migrate-xunit-to-mstest skill from dotnet/skills@main (plugins/dotnet-test/skills/migrate-xunit-to-mstest) into this repo so the xUnit -> MSTest migration that's currently in progress (#54722, #54723, #54724, #54725, #54726) has a documented, repeatable procedure that contributors and agents can follow consistently. Files added (verbatim from upstream): - .github/skills/migrate-xunit-to-mstest/SKILL.md - .github/skills/migrate-xunit-to-mstest/references/mapping-cheatsheet.md Note: SKILL.md is 546 lines, slightly above the 500-line "Progressive Disclosure" guideline checked by .github/skills/ValidateSkill.cs. The validator is advisory (not CI-enforced) and we are intentionally mirroring the upstream content verbatim to keep future syncs trivial. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Replaced the manual Also refreshed the related comments in |
|
Made The new (Applied to all 9 stacked PRs since they share these plumbing files.) |
|
Replaced the custom |
|
Also removed |
|
Switched migration-introduced |
|
Round 3: moved The Using is now global for any test project ( Deviation from your literal suggestion: I left the |
…n MTP
This is a pathfinder PR for migrating the test suite to MSTest on
Microsoft.Testing.Platform (MTP). Microsoft.DotNet.HotReload.Watch.Aspire.Tests
was chosen because it has no dependency on the shared Microsoft.NET.TestFramework
(which is xUnit-coupled and referenced by ~57 of 78 test projects), so it can
migrate in isolation without unblocking dependents first.
Changes:
* global.json: add MSTest.Sdk 4.3.0-preview.26307.5 to msbuild-sdks.
* test/Directory.Build.targets: gate the xUnit defaults
(TestRunnerName=XUnitV3, Using Include=Xunit, etc.) behind
$(UseMSTestSdk) != true, so MSTest.Sdk projects opt out cleanly.
* test/Microsoft.DotNet.HotReload.Watch.Aspire.Tests:
- csproj now uses Sdk="MSTest.Sdk", sets UseMSTestSdk=true, references
AwesomeAssertions and only the Watch.Aspire project. MTP is on by default
via MSTest.Sdk (EnableMSTestRunner + TestingPlatformDotnetTestSupport).
- All 4 unit-test files converted from xUnit to MSTest attributes/asserts
([Fact]/[Theory] -> [TestMethod]/[DataRow], Assert.* equivalents,
Assert.IsInstanceOfType<T>, Assert.HasCount, Assert.IsEmpty).
- Local AssertEx.SequenceEqual<T> helper replaces the xUnit-coupled one
from HotReload.Test.Utilities.
* Move the 2 integration tests (AspireLauncherTests + PipeUtilities) to
test/dotnet-watch.Tests/Aspire/ so the Aspire.Tests project stays a pure
MSTest unit-test project. They keep xUnit because they depend on
WatchSdkTest, WatchableApp, [PlatformSpecificFact], ITestOutputHelper and
TestAssets from Microsoft.NET.TestFramework. AspireLauncherTests was
renamed to AspireLauncherIntegrationTests to reflect its new role.
* src/Dotnet.Watch/Watch.Aspire/Properties/AssemblyInfo.cs: grant
InternalsVisibleTo to dotnet-watch.Tests (needed by PipeUtilities, which
uses internal WatchStatusEvent).
* test/dotnet-watch.Tests/dotnet-watch.Tests.csproj: add ProjectReference to
Watch.Aspire (ExcludeAssets=Runtime) so the moved integration tests
compile.
Verification:
* Microsoft.DotNet.HotReload.Watch.Aspire.Tests builds with MSTest.Sdk and
all 58 unit tests pass under MTP (705 ms).
* test/dotnet-watch.Tests builds successfully with the moved files.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Bumps MSTest.Sdk to the latest internal preview to pick up the newest 4.3 assertion APIs (Assert.ContainsSingle, Assert.Contains for strings with the more natural (needle, haystack) signature, etc.). - Applies the assertion mapping flagged by the migrate-xunit-to-mstest skill in this repo (.github/skills/migrate-xunit-to-mstest, PR dotnet#54727): Assert.HasCount(1, x) -> Assert.ContainsSingle(x) (one occurrence in AspireResourceLauncherCliTests.cs) Verified: 58/58 tests still pass. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Done — updated to assert on actualUpdate.Deltas.Length. |
…EST0049) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…tionTests) PR dotnet#54766 enabled the Recommended MSTest analyzers as errors; dotnet#54758 merged shortly after with violations that are now build errors, leaving main red and blocking all open migration PRs. Fix the two affected files: - CommandResultAssertions.MSTest.cs: MSTEST0037 (IsTrue(a==b)->AreEqual, IsFalse(a==b) ->AreNotEqual) and MSTEST0023 (IsTrue(!x)->IsFalse(x)). - LocalizeTemplateTests.cs: MSTEST0037 (AreEqual(n, x.Length)->HasCount(n, x)). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> (cherry picked from commit 6ac4ef0)
…fresh PR Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
The CI failures on this PR are not related to its changes. This PR migrates
|
|
/azp run dotnet-sdk-public-ci |
|
Azure Pipelines successfully started running 1 pipeline(s). |
The four 2-arg WriteAsync calls originally flowed TestContext.Current.CancellationToken in the xUnit source; restore the test cancellation token via the MSTest TestContext property rather than weakening it to CancellationToken.None. The two 3-arg calls already used CancellationToken.None on main and are left unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
/ba-g #54826 I have closed previous tickets as they were wrongly/partially filled |
|
@tmat would you reviewing/approving PR? |
|
/azp run dotnet-sdk-public-ci |
|
Azure Pipelines successfully started running 1 pipeline(s). |
|
/ba-g #54819 |
Same pattern as #54723 / #54724. None of the 6 test files use any
Microsoft.NET.TestFrameworktypes — only xUnit primitives — so the TestFrameworkProjectReferencecan be dropped and the project switched toMSTest.Sdkin one self-contained change.Changes
Sdk="MSTest.Sdk",UseMSTestSdk=true, drop TestFramework ref +OutputType=Exe, addMicrosoft.VisualStudio.TestTools.UnitTestingusing.[Fact]/[Theory]→[TestMethod],[InlineData]→[DataRow], add[TestClass].Assert.True/False/Null/NotNull/Empty/NotEmpty/Equal/NotEqual→IsTrue/IsFalse/IsNull/IsNotNull/IsEmpty/IsNotEmpty/AreEqual/AreNotEqual.Assert.Single(x)→Assert.HasCount(1, x).Assert.Contains(needle, haystack)→StringAssert.Contains(haystack, needle)(xUnit and MSTest argument orders are reversed).Assert.DoesNotContain(needle, str)→Assert.IsFalse(str.Contains(needle)).Assert.CollectioninBrowserScriptMiddlewareTestexpanded to inlineAssert.HasCount+ indexedAreEqualchecks.Assert.ThrowsAsync<T>→Assert.ThrowsExactlyAsync<T>.Assert.AreEqualonbyte[]/int[]→Assert.AreSequenceEqual(MSTEST0065: MSTest does not do element-wise equality on collections; the analyzer catches a real semantic difference vs xUnit).StringValues(Microsoft.Extensions.Primitives) ambiguity withAssert.AreEqual<T>resolved by calling.ToString()at 5 call sites.TestContext.Current.CancellationToken→CancellationToken.None(MSTest'sTestContext.Currentis experimental; these unit tests do not actually require test-cancellation propagation).Verification
✅ 110/110 tests pass on MTP (~480 ms).
Merge ordering
Stacks on #54724 which stacks on #54723 which stacks on #54722.
Relates to #52914.