SwissLife-OSS / snapshooter

Snapshooter is a snapshot testing tool for .NET Core and .NET Framework
https://swisslife-oss.github.io/snapshooter/
MIT License
303 stars 29 forks source link

Snapshot-naming collisions in async method that verifies multiple snapshots #201

Open N-Olbert opened 3 weeks ago

N-Olbert commented 3 weeks ago

Describe the bug Within a single async method, using multiple snapshots with different names does not work.

To Reproduce

[TestMethod]
public async Task TestFoo()
{
    var something = new Foo();
    var fullName1 = Snapshot.FullName(new SnapshotNameExtension("GetFoo"));
    var fullName2 = Snapshot.FullName(new SnapshotNameExtension("GetBar"));

    something.GetFoo().MatchSnapshot(fullName1);
    something.GetBar().MatchSnapshot(fullName2);  // BOOM - fails since fullname 2 is identical to fullName1

}

Expected behavior Two different snapshots should be created and verified.

Desktop (please complete the following information):

Additional context Using MSTest

The problem is that the entire snapshot-naming info is cached in an AsyncLocal, therfore the second Snapshot.FullName has no effect since this cache is already initialized: https://github.com/SwissLife-OSS/snapshooter/blob/94f9c77703a05e0d03b02aba9adb68d655fab820/src/Snapshooter.MSTest/Snapshot.cs#L15C5-L17C75

N-Olbert commented 3 weeks ago

It works if you do it like that:

[TestMethod]
public async Task TestFoo()
{
    var something = new Foo();
    var fullName1 = Snapshot.FullName(new SnapshotNameExtension("GetFoo"));
    something.GetFoo().MatchSnapshot(fullName1);

    var fullName2 = Snapshot.FullName(new SnapshotNameExtension("GetBar"));
    something.GetBar().MatchSnapshot(fullName2); 

}

... still odd behaviour in my opinion