Nullean.Snapshots.Html
0.1.0
See the version list below for details.
dotnet add package Nullean.Snapshots.Html --version 0.1.0
NuGet\Install-Package Nullean.Snapshots.Html -Version 0.1.0
<PackageReference Include="Nullean.Snapshots.Html" Version="0.1.0" />
<PackageVersion Include="Nullean.Snapshots.Html" Version="0.1.0" />
<PackageReference Include="Nullean.Snapshots.Html" />
paket add Nullean.Snapshots.Html --version 0.1.0
#r "nuget: Nullean.Snapshots.Html, 0.1.0"
#:package Nullean.Snapshots.Html@0.1.0
#addin nuget:?package=Nullean.Snapshots.Html&version=0.1.0
#tool nuget:?package=Nullean.Snapshots.Html&version=0.1.0
<p align="center"> <a href="https://snapshots.nullean.net"> <picture> <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/nullean/snapshots/main/docs/images/brand/png/lockup-light.png"> <img src="https://raw.githubusercontent.com/nullean/snapshots/main/docs/images/brand/png/lockup.png" alt="snapshots." width="276" height="96"> </picture> </a> </p>
<p align="center"><strong>Structural Snapshot tests for .NET</strong></p>
<p align="center"> <a href="https://www.nuget.org/packages/Nullean.Snapshots.AwesomeAssertions"><img alt="NuGet" src="https://img.shields.io/nuget/v/Nullean.Snapshots.AwesomeAssertions?color=9fc9ea&label=nuget"></a> <a href="https://github.com/nullean/snapshots/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/nullean/snapshots/actions/workflows/ci.yml/badge.svg"></a> <a href="https://snapshots.nullean.net"><img alt="Docs" src="https://img.shields.io/badge/docs-snapshots.nullean.net-c6dd7a"></a> </p>
Nullean.Snapshots is snapshot testing on AwesomeAssertions for text, HTML, JSON
and YAML. A test's output is compared with a verified file kept with your tests; when it differs, the test fails with
a short, plain message that says exactly what moved and how to accept it. A small native AOT CLI, snap, reviews and
accepts what changed.
[Test]
public void Serializes() =>
catalog.Should().MatchJsonSnapshot(AppJsonContext.Default.Catalog);
JSON did not match snapshot: tests/Shop.Tests/.snapshots/CatalogTests/Serializes.verified.json
3 difference(s):
$.items[0].name expected "kibana" actual "Kibana" (verified.json:5:15)
$.items[1] missing in actual (verified.json:7:5)
$.extra unexpected in actual
Received: .artifacts/.snapshots/received/Shop.Tests/CatalogTests/Serializes.received.json
Accept: snap accept Shop.Tests/CatalogTests/Serializes (or: dnx Nullean.Snapshots.Cli accept Shop.Tests/CatalogTests/Serializes)
How it works
- Compared by structure, not by text. HTML compares as a DOM; JSON and YAML compare as trees. Attribute order,
whitespace, key order and
1versus1.0do not fail a test, and a changed field is reported by its path, with the line and column in the verified file. - Messages people and agents can act on. Plain text without colour codes, repository-relative paths, at most 20 differences and 80 lines, and the exact command to accept. They read the same in a terminal, a CI log and an agent's context.
- You accept, or nothing changes. Nothing is ever accepted for you.
SNAPSHOT_ACCEPT=1works on your machine; withCIset it is ignored, and the failure says so. - Tidy. Verified files live in one
.snapshots/folder per test project, mirroring your test files. Received files go toobj/or your artifacts folder, never into source. - Lightweight. Every package is trimming- and native-AOT-safe, the core has no heavy dependencies, and every write goes through a file system scoped to the snapshot folders.
Packages
| Package | For |
|---|---|
Nullean.Snapshots.AwesomeAssertions |
Should().MatchSnapshot() for text, and the base the format packages build on |
Nullean.Snapshots.Html |
MatchHtmlSnapshot, BeHtml, ContainHtml, NotContainHtml; select, remove and transform first |
Nullean.Snapshots.Json |
MatchJsonSnapshot for JSON text and objects (AOT-safe through JsonTypeInfo<T>), BeJson |
Nullean.Snapshots.Yaml |
MatchYamlSnapshot, BeYaml; the YAML 1.2 core schema, anchors and merge keys, stored as written |
Nullean.Snapshots.TUnit |
the running TUnit test's class, method and arguments, so every case gets its own file |
Nullean.Snapshots.Cli |
snap: review, diff, accept, reject, and find orphaned snapshots |
Getting started
<PackageReference Include="Nullean.Snapshots.AwesomeAssertions" Version="0.*" />
<PackageReference Include="Nullean.Snapshots.Json" Version="0.*" />
<PackageReference Include="Nullean.Snapshots.TUnit" Version="0.*" />
dotnet tool install --global Nullean.Snapshots.Cli
snap # walk through what changed: accept, reject or skip each snapshot
The first run of a new snapshot fails and writes a received file. Read it, accept it with snap accept <key> (or
snap review), and commit the verified file. From then on a change in output is a decision you make with the
difference in front of you.
Read more at snapshots.nullean.net: the four formats, the snap workflow,
snapshots in CI, working with coding agents, and the reference.
Versions are 0.x while the API settles. The packages need .NET 10.
Contributing
See AGENTS.md for conventions, DECISIONS.md for the choices behind the design and
ROADMAP.md for the plan. scripts/docs.sh builds and serves the documentation locally, given a
docs-builder binary.
License
MIT, see LICENSE.txt.
| 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
- AngleSharp (>= 1.7.2)
- AngleSharp.Diffing (>= 1.1.1)
- Nullean.Snapshots (>= 0.1.0)
- Nullean.Snapshots.AwesomeAssertions (>= 0.1.0)
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.13.0 | 0 | 11/14/2026 |
| 0.12.2 | 38 | 11/14/2026 |
| 0.12.1 | 70 | 11/12/2026 |
| 0.12.0 | 63 | 11/12/2026 |
| 0.11.0 | 246 | 11/11/2026 |
| 0.10.1 | 123 | 11/11/2026 |
| 0.10.0 | 88 | 11/11/2026 |
| 0.9.0 | 81 | 11/11/2026 |
| 0.8.1 | 252 | 11/11/2026 |
| 0.8.0 | 155 | 11/11/2026 |
| 0.7.0 | 224 | 11/10/2026 |
| 0.6.0 | 231 | 11/5/2026 |
| 0.5.0 | 91 | 11/5/2026 |
| 0.4.0 | 539 | 11/5/2026 |
| 0.3.0 | 89 | 11/4/2026 |
| 0.2.0 | 454 | 11/3/2026 |
| 0.1.0 | 88 | 11/3/2026 |
| 0.1.0-alpha.1 | 69 | 11/3/2026 |