altcode.test.expecto 2.0.48

dotnet add package altcode.test.expecto --version 2.0.48
NuGet\Install-Package altcode.test.expecto -Version 2.0.48
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="altcode.test.expecto" Version="2.0.48" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add altcode.test.expecto --version 2.0.48
#r "nuget: altcode.test.expecto, 2.0.48"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install altcode.test.expecto as a Cake Addin
#addin nuget:?package=altcode.test.expecto&version=2.0.48

// Install altcode.test.expecto as a Cake Tool
#tool nuget:?package=altcode.test.expecto&version=2.0.48


Named argument wrappers for unit test frameworks to disambiguate between which argument of type 'a is expected and which actual as there's no consistent ordering between libraries, and even within them (e.g. Expecto and Expecto.Flip).

What's in the box?

A core type

namespace AltCode.Test.[Expecto|NUnit|Xunit]

type AssertionMatch<'a> =
    Actual : 'a
    Expected : 'a
  static member Create() =
      Actual = Unchecked.defaultof<'a>
      Expected = Unchecked.defaultof<'a>
  member this.WithActual e = { this with Actual = e }
  member this.WithExpected e = { this with Expected = e }

providing a F# and C#-friendly API for naming arguments

For Expecto

AltCode.Test.Expecto Nuget

Contains module AltCode.Test.Expecto.AltExpect which provides wrappers for Expecto.Expect and AltCode.Test.Expecto.AltFlipExpect for Expecto.Flip.Expect with an appropriate AltCode.Test.Expecto.AssertionMatch-typed argument in place of actual and template expectation

For Xunit

AltCode.Test.Xunit Nuget

Contains class AltCode.Test.Xunit.AltAssert which provides wrappers for Xunit.Assert with an appropriate AltCode.Test.Xunit.AssertionMatch-typed argument in place of actual and template expectation

For NUnit

AltCode.Test.NUnit Nuget

Contains classes AltCode.Test.NUnit.Alt*Assert which provide wrappers for the corresponding NUnit.Framework.*Assert for * = '', 'Collection', 'Directory', 'File' and 'String' with an appropriate AltCode.Test.Nunit.AssertionMatch-typed argument in place of actual and template expectation; also

type Constraint<'a> =
    Actual : 'a
    Constraint : NUnit.Framework.Constraints.IResolveConstraint
  static member Create() =
      Actual = Unchecked.defaultof<'a>
      Constraint = null
  member this.WithActual e = { this with Actual = e }
  member this.WithConstraint e = { this with Constraint = e }

and wrappers for some NUnit.Framework.Assert.That overloads

Continuous Integration

Build <sup>GitHub</sup> CI Build history
Coverage <sup>Coveralls</sup> Coverage Status


Cross platform, dotnet code throughout.


It is assumed that .net 7.0.100 or later is available (dotnet) -- try


Start by setting up with dotnet tool restore Then dotnet run --project ./Build/Setup.fsproj to do the rest of the set-up.

Normal builds

Running dotnet run --project ./Build/Build.fsproj performs a full build/package process.

Use dotnet run --project ./Build/Build.fsproj --target <targetname> to run to a specific target.

Thanks to

  • Coveralls for allowing free services for Open Source projects
Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
2.0.48 124 1/21/2024
2.0.31 327 12/12/2022
1.0.11 473 6/8/2020

This build from

Q. Never mind the fluff -- how do I get started?
A. Start with the README :

• support Expecto ≥ 10.1.0, NUnit ≥ 4.0.1, Xunit ≥ 2.4.2, FSharp.Core ≥ 8.0.100
• runtime support driven by the consumed packages
◦ Expecto support on net6.0
◦ NUnit support on net462 and net6.0
◦ Xunit support on netstandard2.0
• NUnit support does not rely on the legacy ClassicAssert assembly

• [BREAKING] make the AssertionMatch type specific to each package to avoid name clashes if multiple test suites are in use
• [BREAKING] remove support for obsolescing Expecto Expect.floatEqual
• [BREAKING] remove support for obsolescing NUnit Assert.AreEqual<Nullable<double>> methods
• [BREAKING] rename AltCode.Test.Xunit.AltAssert.DoesNotAssertionMatch & AssertionMatches to AltCode.Test.Xunit.AltAssert.DoesNotMatch and Matches to line up with the methods being shadowed in Xunit.Assert
• [BREAKING] in NUnit methods with ...,message, args) correctly declare args as a params object[] making the methods take variable numbers of arguments
• support netstandard2.0 only (meaning ≥ net472 compatible)
• various fixes to Expecto.Expect and Expecto.Flip.Expect support, including Stream subtypes to be passed w/o explicit coercion to base
• various fixes to Xunit.Assert, including respecting optional arguments and allowing interface subtypes to be passed w/o explicit coercion to base
• support Expecto ≥ 9.0.4, NUnit ≥ 3.13.3, Xunit ≥ 2.4.2, FSharp.Core ≥ 6.0.0
• new for Expecto.Expect
◦ equalWithDiffPrinter
◦ isFasterThan
◦ isFasterThanSub
◦ isGreaterThan
◦ isGreaterThanOrEqual
◦ isLessThan
◦ isLessThanOrEqual
where for comparisons, Actual is what's being tested and Expected is the benchmark value
• new for Expecto.Flip.Expect
◦ containsAll
◦ equalWithDiffPrinter diffPrinter message  (x: AssertionMatch<'a>)
◦ isFasterThan
◦ isFasterThanSub
◦ isGreaterThan
◦ isGreaterThanOrEqual
◦ isLessThan
◦ isLessThanOrEqual
• new for Expecto.CSharp.Function, type AltCSharpExpect for the type-homogenous versions of IsFasterThan
• new for NUnit.Framework.Assert
◦ Greater
◦ GreaterOrEqual
◦ Less
◦ LessOrEqual
• new for Xunit.Assert
◦ Equal of double with MidpointRounding option
◦ Equal of double with tolerance option
◦ Equal of single ditto
◦ Equivalent
◦ NotEqual object overloads

• support Expecto 9.x
• support net47 and netstandard2.0 only

• altcode.test.nunit -- Fix classic framework support
• altcode.test.xunit -- Fix classic framework support

• [BREAKING] Match -> AssertionMatch
• altcode.test.expecto -- add Expecto.Flip support
• altcode.test.nunit -- add DirectoryAssert, FileAssert and StringAssert support
• altcode.test.xunit -- add AltAssert.Same

• [NEW PACKAGE] altcode.test.expecto -- named argument helper for Expecto ≥ 8.12.0
• [NEW PACKAGE] altcode.test.nunit -- named argument helper for NUnit ≥ 3.12.0
• [NEW PACKAGE] altcode.test.xunit -- named argument helper for Xunit ≥ 2.4.1