CheckTestOutput 0.2.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package CheckTestOutput --version 0.2.0
NuGet\Install-Package CheckTestOutput -Version 0.2.0
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="CheckTestOutput" Version="0.2.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add CheckTestOutput --version 0.2.0
#r "nuget: CheckTestOutput, 0.2.0"
#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 CheckTestOutput as a Cake Addin
#addin nuget:?package=CheckTestOutput&version=0.2.0

// Install CheckTestOutput as a Cake Tool
#tool nuget:?package=CheckTestOutput&version=0.2.0

CheckTestOutput

Although it's a nice idea that tests should verify if the results are correct by some smart logic, it not always possible/practical. For example, if you are testing a transpiler, it would come in handy to solve the halting problem, which is not possible. In that cases, you may end up with an assertion that simply checks if the result is equal to one of the valid outputs and that is annoying to maintain. This project just makes it less annoying.

It is a very simple library that performs a check that the test output is the same as last time. It compares the test output with its version from git index and if it does not match it simply throws an exception. To accept a new version of output, you can simply stage a changed file produced by the test. Or, to find where is the difference, you can use your favorite tool for comparing changes in the source tree.

Usage

It requires your project to be in git version control system. You can use any test framework you want, this thing just throws some exceptions, I'll use XUnit in the examples here. CheckTestOutput class just checks if some files match output from your test. The constructor parameter specifies where are the files going to be stored relative to the test file location (it uses C#/F# caller info attributes), in this case, it's ./testoutputs. The file name is the method name, in this case, SomeTest.TestString.txt.

This is how you check if simple string matches:

public class SomeTest
{
    OutputChecker check = new OutputChecker("testoutputs");
    [Fact]
    public void TestString()
    {
        string someData = DoSomeComputation();
        check.CheckString(someData);
    }
}

You can also check if a collection of lines matches:

[Fact]
public void TestLines()
{
    IEnumerable<string> someData = GetSomeResults().Select(a => a.ToString());
    check.CheckLines(someData);
}

Or, you can check if the object matches when it is serialized to JSON (using Newtonsoft.Json)

[Fact]
public void TestObject()
{
    PersonViewModel someData = GetDefaultPersonDetail();
    check.CheckJsonObject(someData);
}

In case you want to use more that one check in one test, you can give them names (so they don't end up overriding themselves):

[Fact]
public void TestWithMultipleChecks()
{
    PersonViewModel person = GetDefaultPersonDetail();
    check.CheckString(someData.CurriculumVitae, checkName: "cv");
    check.CheckString(someData.Genome, checkName: "genome");
}

Or you can combine them into one anonymous JSON object (this is preferable when it's short - you don't end up with so many tiny files):

[Fact]
public void TestWithMultipleChecks()
{
    PersonViewModel person = GetDefaultPersonDetail();
    check.CheckJsonObject(new { fname = person.Name, lname = person.LastName, person.BirthDate });
}

The text files have .txt file extension by default, if that annoys you because your strings have some specific format and syntax highlighting does not work in text files...

[Fact]
public void GenerateSomeCsharpCode()
{
    string code = GimmeSourceCode();
    check.CheckString(code, fileExtension: "cs");
}

Just keep in mind that dotnet is going to treat these .cs files as part of source code unless you <Compile Remove="testoutputs/**.cs" /> them in the .csproj file.

F#

This library is F# friendly, although it's written in C#:

open CheckTestOutput

let check = OutputChecker "testoutputs"

[<Fact>]
let ``Simple object processing - UseGenericUnion`` () = task {
    computeSomething 123 "456"
    |> string
    |> check.CheckString

    // or if you need checkName
    check.CheckString ("test string", checkName = "test2")
}

Installation

Just install CheckTestOutput NuGet package.

dotnet add package CheckTestOutput

Or, you can just grab the source codes from src folder and copy them into your project (it's MIT licensed, so just keep a link to this project in the copied code or something). This project has a dependency on MedallionShell - an amazing library for executing processes without glitches the standard .NET API has. Also, we have a dependency on Newtonsoft.Json for the JSON serialization. If you are copying the code you'll probably install these.

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 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. 
.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. 
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 (1)

Showing the top 1 popular GitHub repositories that depend on CheckTestOutput:

Repository Stars
riganti/dotvvm
Open source MVVM framework for Web Apps
Version Downloads Last updated
0.6.3 836 7/30/2023
0.6.2 117 7/30/2023
0.6.1 127 7/25/2023
0.6.0 523 1/28/2023
0.5.1 2,039 6/11/2022
0.4.3 2,577 6/16/2022
0.4.2 9,446 11/7/2021
0.4.1 278 11/7/2021
0.4.0 2,985 7/17/2020
0.3.0 645 12/20/2019
0.2.2 584 3/5/2019
0.2.1 548 3/5/2019
0.2.0 684 3/1/2019
0.1.0 836 1/23/2019