Wollte man grössere Datenstrukturen als Input für Unit-Tests verwenden, war bislang der einfachste Weg, im Projekt ein Json-File mit den entsprechenden Daten abzulegen. Neu können Json-Daten auch inline in den Code kopiert werden ohne diese mühsam escapen zu müssen.
Anbei ein Beispiel-Datensatz:
const string testjson = """
{
"CreationDate": "2022-11-14T00:00:00+01:00",
"DocumentLanguage": "de",
"TemplateName": "LetterTemplate",
"DocumentId": "b12056b8-4452-4df1-b83c-b288c1c9fd35",
"IsVerified": true
}
""";
Wichtig ist dabei, die 3 Quotes jeweils auf einer separaten Zeile zu belassen. Falls die letzte Zeile eingerückt wird, sind die entsprechenden Spaces/Tabs nicht im String-Literal enthalten.
DataTest.cs
namespace UnitTests;
public static class DataTests
{
const string testjson = """
{
"CreationDate": "2022-11-14T00:00:00+01:00",
"DocumentLanguage": "de",
"TemplateName": "LetterTemplate",
"DocumentId": "b12056b8-4452-4df1-b83c-b288c1c9fd35",
"IsVerified": true
}
""";
public enum Language { de, fr, it, en }
public record DocumentMetadata(
Guid DocumentId,
Language DocumentLanguage,
string TemplateName,
bool IsVerified,
DateTimeOffset CreationDate);
private static JsonSerializerOptions serializerOptions
= new JsonSerializerOptions
{
Converters = {
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, true)
}
};
[Fact]
public static void TestWithData()
{
DocumentMetadata? dm = JsonSerializer.Deserialize<DocumentMetadata>(testjson, serializerOptions);
dm.Should().NotBeNull();
dm.CreationDate.Should().Be(new DateTimeOffset(2022, 11, 14, 0, 0, 0, TimeSpan.FromHours(1)));
dm.DocumentLanguage.Should().Be(Language.de);
dm.TemplateName.Should().Be("LetterTemplate");
dm.IsVerified.Should().BeTrue();
}
}
Usings.cs
global using FluentAssertions;
global using Xunit;
global using System.Text.Json.Serialization;
global using System.Text.Json;
UnitTests.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FluentAssertions" Version="6.8.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
</Project>