Shouldly Migration Check for FluentAssertions

Maps every FluentAssertions line in a .csproj or C# test file to its Shouldly replacement and flags FluentAssertions 8+ (commercial use needs a paid Xceed licence). Runs entirely in your browser — nothing is uploaded.

Same engine as the VS Code extension, byte for byte.

Get the full version $29

Scan every project and test file in the workspace at once and export one dated Markdown migration plan, each FluentAssertions line mapped to its Shouldly line, for the licence review ticket.

One payment, one licence key for this tool. The key is shown right after payment.

Xceed lists a Fluent Assertions licence from 14.95 USD a year without support (xceed.com blog).

Buy the full version — $29
Embed this tool on your site (free)

Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.

 All embeddable tools

For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. See Pro →

Email me this result
A copy of what you see above, in your inbox — the tool stays free, nothing here is locked.
ENDEJAESPT

Find a tool

· ReadyStack

Worked example

Real numbers from this tool, line by line.

Migrate from FluentAssertions to Shouldly: 6 lines in one xUnit test file

shouldly migration: 6 findings in one xUnit test file for a .NET order service, written by a C# developer at a for-profit company and checked on 2026-10-12. Every finding comes back with the Shouldly line that replaces it:

LineFluentAssertionsShouldly
3using FluentAssertions;using Shouldly;
18total.Should().Be(119.00m);total.ShouldBe(119.00m);
19order.Lines.Should().HaveCount(3);order.Lines.Count().ShouldBe(3);
20order.Customer.Should().NotBeNull();order.Customer.ShouldNotBeNull();
31act.Should().Throw<InvalidOperationException>().WithMessage("Order is already paid");Should.Throw<InvalidOperationException>(act).Message.ShouldBe("Order is already paid");
40_service.Invoice(order).Should().BeEquivalentTo(expected);_service.Invoice(order).ShouldBeEquivalentTo(expected);

The same file rewritten with those six lines returns 0 findings.

What changed on 2025-01-14

FluentAssertions 8.0.0 was published on NuGet on 2025-01-14. Its package description says the version is free for open-source projects and non-commercial use, and that commercial use requires a paid licence from Xceed. Every 7.x release is Apache-2.0, and 7.2.2 (published 2026-03-16) is the latest one. The newest 8.x release is 8.11.0 (2026-09-14). On 2026-10-12 the change was 636 days old.

Why a version list is not enough

dotnet list package prints versions, never licences. A test project that says Version="[7.0.0,)" or Version="*" resolves to the newest 8.x on the next restore, and a Dependabot pull request that bumps 7.2.2 to 8.11.0 looks like any other green update. The check reads the project file and flags both: 8.x references as errors, floating ranges as warnings, with the pin [7.2.2,8.0.0) if you want to stay on Apache-2.0 for now.

Two exits

Shouldly 4.3.0 is BSD-3-Clause. Its syntax is different (x.ShouldBe(y) instead of x.Should().Be(y)), which is why each finding carries the rewritten line. AwesomeAssertions 9.6.0 is an Apache-2.0 fork that keeps the FluentAssertions syntax; the using-line finding names it as the second exit: using AwesomeAssertions;.

What the 19 rules cover

Six rules read project files: 8.x packages, floating versions, 7.x pins, versions set in Directory.Packages.props, FluentAssertions.* add-on packages, and the MSBuild global using item. Thirteen read C# test code: the using line, equality, booleans, null and empty, collections, BeEquivalentTo, comparisons, strings, types, Throw/ThrowAsync/NotThrow, WithMessage, AssertionScope, and any Should() call with no 1:1 Shouldly method, which is reported for a hand rewrite instead of guessed.

Two things the check will not pretend. BeEquivalentTo and ShouldBeEquivalentTo can compare objects by different rules, so that finding tells you to run the test after the swap. AssertionScope has no Shouldly type; the finding points at ShouldSatisfyAllConditions.

Free and full

The free check runs on the open file in VS Code or on the web page, with no key: one .csproj, Directory.Packages.props, packages.config or test file, every line mapped. The full version scans every project and test file in the workspace at once and exports one dated Markdown migration plan for the licence review ticket. Xceed lists a Fluent Assertions licence from 14.95 dollars a year without support, so the plan is the document a team lead needs either way: stay and license, or move.

15 seconds — what it actually does

Questions people ask

What does Shouldly Migration Check do?

It reads .csproj, Directory.Packages.props, packages.config and C# test files and lists every FluentAssertions line with the Shouldly line that replaces it, such as total.Should().Be(119.00m) to total.ShouldBe(119.00m). In one xUnit test file it found 6 findings with 19 rules: the using line, Be, HaveCount, NotBeNull, Throw with WithMessage, and BeEquivalentTo.

Who is Shouldly Migration Check for?

C# developers and .NET team leads at for-profit companies whose unit tests use FluentAssertions. Since 8.0.0 (NuGet 2025-01-14) FluentAssertions is free only for open-source and non-commercial use, so a company test project on 8.x needs a paid Xceed licence or a move to Shouldly (BSD-3-Clause) or AwesomeAssertions (Apache-2.0).

Why not just use dotnet list package or a chatbot?

dotnet list package prints versions, never licences, and a range like [7.0.0,) or * silently resolves to the newest 8.x on restore. A chatbot rewrites the lines you paste and can invent Shouldly methods. This check reads your own file, flags floating ranges, and reports a Should() call with no 1:1 Shouldly method for a hand rewrite instead of guessing.

What is free and what needs the licence key?

Free with no key: check one open .csproj, Directory.Packages.props, packages.config or C# test file and see every FluentAssertions line with its Shouldly line, in VS Code or on the web page. The licence key scans every project and test file in the workspace at once and exports one dated Markdown migration plan for the licence review ticket.

What does staying on FluentAssertions cost?

Xceed lists a Fluent Assertions licence from 14.95 USD a year without support, on its own blog. Staying on 7.x is free under Apache-2.0 if you pin Version="[7.2.2,8.0.0)". Moving to Shouldly 4.3.0 or AwesomeAssertions 9.6.0 costs the rewrite of each assertion line, which this check writes out for you.

When does the FluentAssertions licence change next?

No further dated change is announced. FluentAssertions 8.11.0 (NuGet 2026-09-14) is the latest release under the Xceed licence, and 7.2.2 (2026-03-16) is the latest Apache-2.0 release. Any new 7.x patch would stay Apache-2.0; every 8.x release so far carries the commercial-use condition.

Ask about this tool

One question, answered by the person who built it. Your email only if you want the answer sent.