Snapshooter 1.3.1

dotnet add package Snapshooter --version 1.3.1
                    
NuGet\Install-Package Snapshooter -Version 1.3.1
                    
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="Snapshooter" Version="1.3.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Snapshooter" Version="1.3.1" />
                    
Directory.Packages.props
<PackageReference Include="Snapshooter" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Snapshooter --version 1.3.1
                    
#r "nuget: Snapshooter, 1.3.1"
                    
#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.
#:package Snapshooter@1.3.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Snapshooter&version=1.3.1
                    
Install as a Cake Addin
#tool nuget:?package=Snapshooter&version=1.3.1
                    
Install as a Cake Tool

Snapshooter

Nuget GitHub Release Build Status Coverage Status Quality

Snapshooter is a snapshot testing tool for .NET Core and .NET Framework

Snapshooter is a flexible snapshot testing tool to simplify the result validation in your unit tests in .Net. It is based on the idea of Jest Snapshot Testing.

To get more detailed information about Snapshooter, go to the Snapshooter Docs

Getting Started

To get started, install the Snapshooter Xunit or NUnit nuget package:

XUnit

dotnet add package Snapshooter.Xunit

NUnit

dotnet add package Snapshooter.NUnit

MSTest

dotnet add package Snapshooter.MSTest

Get Started

Assert with Snapshots

To assert your test results with snapshots in your unit tests, follow the following steps:

1. Add snapshot assert statement

Insert a snapshot assert statement Snapshot.Match(yourResultObject); into your unit test.

Example:

/// <summary>
/// Tests if the new created person is valid.
/// </summary>
[Fact]
public void CreatePersonSnapshotTest()
{
    // arrange
    var serviceClient = new ServiceClient();

    // act
    TestPerson person = serviceClient.CreatePerson(
        Guid.Parse("2292F21C-8501-4771-A070-C79C7C7EF451"), "David", "Mustermann");

    // assert
    Snapshot.Match(person);
}
2. Run the unit test to create a new Snapshot

The Snapshot.Match(person) statement creates a new snapshot of your result object and stores it in the __snapshots__ folder. The __snapshots__ folder is always next to your executed unit test file.

Snapshot name: <UnitTestClassName>.<TestMethodName>.snap

3. Review new snapshot

Review your new snapshot file __snapshots__/<UnitTestClassName>.<TestMethodName>.snap.

4. Run unit test to assert

Now the Snapshot.Match(person) statement will create again a snapshot of your test result and compare it against your reviewed snapshot in the __snapshots__ folder. The __snapshots__ folder is always next to your executed unit test file.

Mismatching Snapshot Handling

If your result object has changed and the existing snapshot is not matching anymore, then the unit test will fail. The unit test error message will point to the exact mismatching position within the snapshot.

In addition, in the snapshot folder __snapshots__ a subfolder with name __mismatch__ will be created. In this folder you can find the actual snapshot which is mismatching with the existing snapshot in the __snapshots__ folder. Therefore it is possible to compare the two snapshots with a text compare tool.

If the snapshot in the mismatching folder __mismatch__ is correct, just move it to the parent __snapshots__ folder (override the existing one).

Read More

Different Match-Syntax Possibilities

The default match syntax for snapshots is:

    Snapshot.Match(person);

However, we also could use the fluent syntax:

    person.MatchSnapshot();

Or we can use FluentAssertion's should() syntax:

    person.Should().MatchSnapshot();

For NUnit we will support the Assert.That syntax (Coming soon):

    Assert.That(person, Match.Snapshot());

Features

Ignore Fields in Snapshots

If some fields in your snapshot shall be ignored during snapshot assertion, then the following ignore options can be used:

[Fact]
public void CreatePersonSnapshot_IgnoreId()
{
    // arrange
    var serviceClient = new ServiceClient();

    // act
    TestPerson person = serviceClient.CreatePerson("Hans", "Muster");

    // assert
    Snapshot.Match<Person>(testPerson, matchOptions => matchOptions.IgnoreField("Size"));
}

The fields to ignore will be located via JsonPath, therefore you are very flexible and you can also ignore fields from child objects or arrays.

Ignore Examples:

// Ignores the field 'StreetNumber' of the child node 'Address' of the person
Snapshot.Match<Person>(person, matchOptions => matchOptions.IgnoreField("Address.StreetNumber"));

// Ignores the field 'Name' of the child node 'Country' of the child node 'Address' of the person
Snapshot.Match<Person>(person, matchOptions => matchOptions.IgnoreField("Address.Country.Name"));

// Ignores the field 'Id' of the first person in the 'Relatives' array of the person
Snapshot.Match<Person>(person, matchOptions => matchOptions.IgnoreField("Relatives[0].Id"));

// Ignores the field 'Name' of all 'Children' nodes of the person
Snapshot.Match<Person>(person, matchOptions => matchOptions.IgnoreField("Children[*].Name"));

// Ignores all fields with name 'Id'
Snapshot.Match<Person>(person, matchOptions => matchOptions.IgnoreField("**.Id"));
Ignore All Fields by name

If we want to ignore all fields by a specific name, then we have two options:

Option 1: Use the ignore match option 'IgnoreAllFields(<fieldName>)' and add the name.

// Ignores all fields with name 'Id'
Snapshot.Match<Person>(person, matchOptions => matchOptions.IgnoreAllFields("Id"));

Option 2: Use the default ignore match option 'IgnoreFields(**.<fieldName>)' with the following JsonPath syntax **.<fieldName>

// Ignores all fields with name 'Id'
Snapshot.Match<Person>(person, matchOptions => matchOptions.IgnoreFields("**.Id"));

Hash Fields in Snapshots

If some fields of our snapshot are too big, for example a binary field with a lot of data, then we can use the HashField option. The HashField option creates a Hash of the field value and therefore each time only the hash is compared. If there is a change in the field value, then the snapshot match will fail.

[Fact]
public void ImageSnapshot_HashImageBinary()
{
    // arrange
    var serviceClient = new ServiceClient();

    // act
    TestImage image = serviceClient.CreateMonaLisaImage();

    // assert
    Snapshot.Match(image, matchOptions => matchOptions.HashField("Data"));
}

Example Snapshot with Hash

{
  "Id": 3450987,
  "OwnerId": "0680faef-6e89-4d52-bad8-291053c66696",
  "Name": "Mona Lisa",
  "CreationDate": "2020-11-10T21:23:09.036+01:00",
  "Price": 951868484.345,
  "Data": "m+sQR9KG9WpgYoQiRASPkt9FLJOLsjK86UuiXKVRzas="  
}

The field(s) to hash can be located via JsonPath or via field name.

Hash Field Examples:

// Hash the field 'Data' of the child node 'Thumbnail' of the person
Snapshot.Match<Person>(person, matchOptions => matchOptions.HashField("Thumbnail.Data"));

// Hash the field 'Data' of the first thumbnail in the 'Thumbnails' array of the image
Snapshot.Match<Person>(person, matchOptions => matchOptions.HashField("Thumbnails[0].Data"));

// Ignores the field 'Data' of all 'Thumbnails' nodes of the image
Snapshot.Match<Person>(person, matchOptions => matchOptions.HashField("Thumbnails[*].Data"));

// Ignores all fields with name 'Data'
Snapshot.Match<Person>(person, matchOptions => matchOptions.HashField("**.Data"));

Assert Fields in Snapshots

Sometimes there are fields in a snapshot, which you want to assert separately against another value.

For Example, the Id field of a 'Person' is always newly generated in a service, therefore you receive in the test always a Person with a new id (Guid). Now if you want to check that the id is not an empty Guid, the Assert option can be used.

/// <summary>
/// Tests if the new created person is valid and the person id is not empty.
/// </summary>
[Fact]
public void CreatePersonSnapshot_AssertId()
{
    // arrange
    var serviceClient = new ServiceClient();

    // act
    TestPerson person = serviceClient.CreatePerson("Hans", "Muster"); // --> id is created within the service

    // assert
    Snapshot.Match<Person>(testPerson, matchOption => matchOption.Assert(
                    fieldOption => Assert.NotEqual(Guid.Empty, fieldOption.Field<Guid>("Id"))));
}

The fields to assert will be located via JsonPath, therefore you are very flexible and you can also ignore fields from child objects or arrays.

Assert Examples:

// Assert the field 'Street' of the 'Address' of the person
Snapshot.Match<Person>(person, matchOption => matchOption.Assert(
                    fieldOption => Assert.Equal(15, fieldOption.Field<int>("Address.StreetNumber"))));

// Asserts the field 'Code' of the field 'Country' of the 'Address' of the person
Snapshot.Match<Person>(person, matchOption => matchOption.Assert(
                    fieldOption => Assert.Equal("De", fieldOption.Field<CountryCode>("Address.Country.Code"))));

// Asserts the fist 'Id' field of the 'Relatives' array of the person
Snapshot.Match<Person>(person, > matchOption.Assert(
                    fieldOption => Assert.NotNull(fieldOption.Field<string>("Relatives[0].Id"))));

// Asserts every 'Id' field of all the 'Relatives' of the person
Snapshot.Match<Person>(person, > matchOption.Assert(
                    fieldOption => Assert.NotNull(fieldOption.Fields<string>("Relatives[*].Id"))));
 
// Asserts 'Relatives' array is not empty
Snapshot.Match<Person>(person, > matchOption.Assert(
                    fieldOption => Assert.NotNull(fieldOption.Fields<TestPerson>("Relatives[*]"))));

The Snapshooter assert functionality is not limited to Xunit or NUnit asserts, it also could be used Fluent Assertions or another assert tool.

Concatenate Ignore & Asserts checks

All the ignore, isType or assert field checks can be concatenated.

[Fact]
public void Match_ConcatenateFieldChecksTest_SuccessfulMatch()
{
    // arrange
    var serviceClient = new ServiceClient();

    // act
    TestPerson person = serviceClient.CreatePerson("Hans", "Muster");

    // act & assert
    Snapshot.Match<TestPerson>(testPerson, matchOption => matchOption
            .Assert(option => Assert.NotEqual(Guid.Empty, option.Field<Guid>("Id")))
            .IgnoreField<DateTime>("CreationDate")
            .Assert(option => Assert.Equal(-58, option.Field<int>("Address.StreetNumber")))
            .Assert(option => testChild.Should().BeEquivalentTo(option.Field<TestChild>("Children[3]")))
            .IgnoreField<TestCountry>("Address.Country")
            .Assert(option => Assert.Null(option.Field<TestCountry>("Relatives[0].Address.Plz"))));
}

Using Snapshooter in CI-Builds

When running snapshooter tests in a CI-build you might want to ensure that a snapshots are correctly checked-in since otherwise tests without a snapshot will just create the initial snapshot and become green.

In order to fail tests that are without a snapshot on your CI-build you can set the snapshooter behavior to strict-mode by setting the environment variable SNAPSHOOTER_STRICT_MODE to on or true.

Community

This project has adopted the code of conduct defined by the Contributor Covenant to clarify expected behavior in our community. For more information, see the Swiss Life OSS Code of Conduct.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  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 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 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. 
.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 is compatible.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (7)

Showing the top 5 NuGet packages that depend on Snapshooter:

Package Downloads
Snapshooter.Xunit

Xunit Snapshooter is a flexible snapshot testing tool for .Net unit tests with Xunit. It creates and asserts snapshots (json) within Xunit unit tests.

Snapshooter.NUnit

NUnit Snapshooter is a flexible snapshot testing tool for .Net unit tests with NUnit. It creates and asserts snapshots (json format) within NUnit unit tests.

Snapshooter.MSTest

MSTest Snapshooter is a flexible snapshot testing tool for .Net unit tests with MSTest. It creates and asserts snapshots (json format) within MSTest unit tests.

Bard

Bard is a .NET library for functional API testing.

Snapshooter.Xunit3

Xunit Snapshooter is a flexible snapshot testing tool for .Net unit tests with Xunit. It creates and asserts snapshots (json) within Xunit unit tests.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.3.1 246 2/24/2026
1.3.1-preview.3 23 2/24/2026
1.3.1-preview.1 25 2/24/2026
1.3.0 5,426 2/19/2026
1.2.0 532 2/18/2026
1.2.0-preview.1 46 2/18/2026
1.1.0 107,926 12/22/2025
1.1.0-preview.4 144 12/22/2025
1.0.1 1,087,717 2/5/2025
1.0.0 226,920 12/20/2024
0.15.0 128,424 12/20/2024
0.14.1 3,151,855 1/17/2024
0.14.0 84,679 1/5/2024
0.13.0 1,581,069 2/28/2023
0.12.0 516,616 11/18/2022
0.11.1 1,565 11/18/2022
0.11.0 5,317 11/18/2022
0.10.0 37,669 11/16/2022
0.9.0 23,356 11/7/2022
0.8.0 47,624 11/1/2022
Loading failed