Catchy 0.0.1
dotnet add package Catchy --version 0.0.1
NuGet\Install-Package Catchy -Version 0.0.1
<PackageReference Include="Catchy" Version="0.0.1" />
<PackageVersion Include="Catchy" Version="0.0.1" />
<PackageReference Include="Catchy" />
paket add Catchy --version 0.0.1
#r "nuget: Catchy, 0.0.1"
#:package Catchy@0.0.1
#addin nuget:?package=Catchy&version=0.0.1
#tool nuget:?package=Catchy&version=0.0.1
Catchy
Async-native fluent assertion library for .NET — real soft assertions, observability hooks, and source-generator-powered typed surfaces.
dotnet add package Catchy
dotnet add package Catchy.XUnit # or .NUnit / .MSTest / .TUnit / .ReqnrollPlugin
Entry points
using static Catchy.Stateless; // Assert (hard, global singleton)
using static Catchy.Ambient; // Assert (hard) + Assert.Soft (soft, per-test)
using static Catchy.AmbientSoft; // Verify (soft only)
using static Catchy.StatelessAlias; // Check (when Assert conflicts with a framework)
Hard assertions
using static Catchy.Stateless;
await Assert.That(user.Name).IsNotNull();
await Assert.That(order.Total).IsGreaterThan(0m).Because("free orders go through promotions");
await Assert.That(tags).Contains("urgent").And().HasCount(3);
Soft assertions — all failures collected, reported together
using static Catchy.AmbientSoft;
await Verify.That(order.Id).IsGreaterThan(0);
await Verify.That(order.Total).IsGreaterThan(0m);
await Verify.That(order.Status).IsNotEmpty();
// AggregateAssertionException thrown on flush (auto via framework package, or manual)
Mixed hard and soft
using static Catchy.Ambient;
await Assert.That(order.Id).IsGreaterThan(0); // hard — throws immediately
await Assert.Soft.That(order.Total).IsGreaterThan(0m); // soft — accumulates
await Assert.Soft.That(order.Status).IsNotEmpty(); // soft — accumulates
Quantifiers
await Assert.ThatEachOf(items).IsNotNull();
await Assert.ThatAnyOf(statuses).Is("active");
await Assert.ThatNoneOf(errors).IsNotEmpty();
Observability hooks
var assert = Asserter.NewStateful(cfg =>
{
cfg.OnAssertion = [async info => await LogAssertion(info)];
cfg.OnSoftFailure = [async info => await CaptureScreenshot(info)];
});
await assert.That(pageTitle).Contains("Dashboard");
await assert.Soft.That(userName).Is("admin");
Why Catchy?
- Async-native. Every chain is
awaited — async hooks with no threading workarounds. - Real soft assertions. Interleave soft and hard; pass failure state across helpers, step definitions, and DI.
- No IntelliSense pollution.
Assert.That(value)— not.Should()on every type. - Source-generator extensibility. Add
[Assertable]to your type, get a full typed assertion surface generated. - Trailing modifiers.
.Because("reason").IgnoringCase()after the assertion — reads like a sentence. - Conflict-free aliases. Built-in
Check/Verifyand support for custom entry points. - MIT, permanently.
Pre-1.0 — API will change. Full docs · Usage guide · Contributing
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 is compatible. net5.0-windows was computed. 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 is compatible. 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 is compatible. 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. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- System.Text.Json (>= 10.0.10)
-
net5.0
- No dependencies.
-
net6.0
- No dependencies.
-
net7.0
- No dependencies.
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages (7)
Showing the top 5 NuGet packages that depend on Catchy:
| Package | Downloads |
|---|---|
|
Catchy.Playwright
Catchy integration package for Microsoft.Playwright browser and page assertions. |
|
|
Catchy.Cecil
Catchy integration helpers for Mono.Cecil-based inspection and validation scenarios. |
|
|
Catchy.NUnit
Catchy integration package for NUnit with soft/hard assertion workflow support. |
|
|
Catchy.ReqnrollPlugin
Catchy integration plugin for Reqnroll step-based testing workflows. |
|
|
Catchy.TUnit
Catchy integration package for TUnit with async-friendly fluent assertions. |
GitHub repositories
This package is not used by any popular GitHub repositories.