Ananke.Orchestration.Conformance.NUnit
0.9.0
dotnet add package Ananke.Orchestration.Conformance.NUnit --version 0.9.0
NuGet\Install-Package Ananke.Orchestration.Conformance.NUnit -Version 0.9.0
<PackageReference Include="Ananke.Orchestration.Conformance.NUnit" Version="0.9.0" />
<PackageVersion Include="Ananke.Orchestration.Conformance.NUnit" Version="0.9.0" />
<PackageReference Include="Ananke.Orchestration.Conformance.NUnit" />
paket add Ananke.Orchestration.Conformance.NUnit --version 0.9.0
#r "nuget: Ananke.Orchestration.Conformance.NUnit, 0.9.0"
#:package Ananke.Orchestration.Conformance.NUnit@0.9.0
#addin nuget:?package=Ananke.Orchestration.Conformance.NUnit&version=0.9.0
#tool nuget:?package=Ananke.Orchestration.Conformance.NUnit&version=0.9.0
Ananke.Orchestration.Conformance.NUnit
NUnit fixtures over the conformance contract. Inherit one, supply the adapter, and every scenario runs as its own test case.
[TestFixture]
public sealed class OpenAIConformanceTests : StreamingAgentModelConformanceTests
{
protected override IStreamingAgentModel CreateModel() =>
new OpenAIChatAgentModel(StubbedClient(), "gpt-4o-mini");
}
There are three: StreamingAgentModelConformanceTests, ToolSchemaTranslatorConformanceTests
and JsonSchemaTranslatorConformanceTests.
Why this is a separate package
The contract itself must not be tied to a runner. Ananke.Orchestration.Conformance
holds the scenarios as named delegates and asserts with Shouldly, which throws its own exception type
and needs no framework; everything NUnit-shaped lives here. A consumer on xUnit, MSTest or TUnit takes
the core, writes about ten lines of glue, and never acquires an NUnit dependency they did not choose.
That glue is all this package is:
[TestCaseSource] over Scenarios |
so each rule reports as its own test case rather than one aggregate |
ConformanceOutcomeAssert |
maps Passed / Skipped / Failed onto NUnit's vocabulary |
ConformanceOutcomeAssert is public so you can use the mapping from a hand-written fixture without
inheriting one of the three.
Two details that are deliberate
Skipped becomes Assert.Ignore, so a skip reports as a skip. Several rules are conditional —
"when usage is reported…" — and a provider that legitimately does not report usage has nothing
to prove. The fixtures this grew from wrote that as Assert.Pass, which reports as a pass: a
subclass that skipped every conditional scenario would read as fully green, which is the exact
failure this package exists to prevent one level up.D2 says "other runners map it to
their own skip" — NUnit's own skip is Assert.Ignore, so this follows D2's principle over its
letter. The reason string is carried through, so the runner shows why.
A failure without a captured assertion throws AssertionException rather than calling
Assert.Fail. Assert.Fail records into NUnit's ambient result as well as throwing, so a caught
Assert.Fail still fails the surrounding test. Throwing the same exception type keeps the mapping
testable and self-contained.
This is a library, not a test project
It references NUnit but neither Microsoft.NET.Test.Sdk nor NUnit3TestAdapter, so referencing it does not turn a consumer's project into something the SDK tries to run. Discovery happens in your test project, against your concrete subclasses.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. 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. |
-
net10.0
- Ananke.Abstractions (>= 0.9.0)
- Ananke.Orchestration.Conformance (>= 0.9.0)
- NUnit (>= 4.6.1)
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 |
|---|---|---|
| 0.9.0 | 85 | 9/22/2026 |