Serializer settings
April 3, 2026 ยท View on GitHub
Verify uses Argon for serialization. See Default Settings for on how Argon is used and instructions on how to control that usage.
Serialization settings can be customized at three levels:
- Method: Will run the verification in the current test method.
- Class: Will run for all verifications in all test methods for a test class.
- Global: Will run for test methods on all tests.
Not valid json
Note that the output is technically not valid json.
- Names and values are not quoted.
- Newlines are not escaped.
The reason for these is that it makes approval files cleaner and easier to read and visualize/understand differences.
UseStrictJson
To use strict json call VerifierSettings.UseStrictJson:
Globally
[ModuleInitializer]
public static void Init() =>
VerifierSettings.UseStrictJson();
Instance
var target = new TheTarget
{
Value = "Foo"
};
var settings = new VerifySettings();
settings.UseStrictJson();
await Verify(target, settings);
Fluent
var target = new TheTarget
{
Value = "Foo"
};
await Verify(target)
.UseStrictJson();
Result
Then this results in
- The default
.received.and.verified.extensions for serialized verification to be.json. JsonTextWriter.QuoteCharto be".JsonTextWriter.QuoteNameto betrue.
Then when an object is verified:
var target = new TheTarget
{
Value = "Foo"
};
await Verify(target);
The resulting file will be:
{
"Value": "Foo"
}
Default settings
Verify uses Argon for serialization.
Argon is a JSON framework for .NET. It is a hard fork of Newtonsoft.Json.
The default JsonSerializerSettings are:
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
DefaultValueHandling = DefaultValueHandling.Ignore
};
Modify Defaults
Globally
VerifierSettings
.AddExtraSettings(_ =>
_.TypeNameHandling = TypeNameHandling.All);
Instance
[Fact]
public Task AddExtraSettings()
{
var settings = new VerifySettings();
settings
.AddExtraSettings(
_ => _.SerializeError = (currentObject, originalObject, location, member, exception, handled) =>
Console.WriteLine(member));
return Verify("Value", settings);
}
Fluent
[Fact]
public Task AddExtraSettingsFluent() =>
Verify("Value")
.AddExtraSettings(
_ => _.SerializeError = (currentObject, originalObject, location, member, exception, handled) =>
Console.WriteLine(member));
QuoteName is false
JsonTextWriter.QuoteName is set to false. The reason for this is that it makes approval files cleaner and easier to read and visualize/understand differences.
Empty collections are ignored
By default empty collections are ignored during verification.
To disable this behavior globally use:
VerifierSettings.DontIgnoreEmptyCollections();
Changing Argon settings
Extra Argon settings can be made:
Globally
VerifierSettings.AddExtraSettings(
_ => _.TypeNameHandling = TypeNameHandling.All);
Instance
var settings = new VerifySettings();
settings.AddExtraSettings(
_ => _.TypeNameHandling = TypeNameHandling.All);
Argon Converter
One common use case is to register a custom JsonConverter. As only writing is required, to help with this there is WriteOnlyJsonConverter, and WriteOnlyJsonConverter<T>.
For example given the following JsonConverter:
class CompanyConverter :
WriteOnlyJsonConverter<Company>
{
public override void Write(VerifyJsonWriter writer, Company company)
{
writer.WriteMember(company, company.Name, "Name");
writer.WriteMember(company, company.Employees, "Employees");
}
}
It can be added in a ModuleInitializer:
[ModuleInitializer]
public static void Initialize() =>
VerifierSettings.AddExtraSettings(_ => _.Converters.Add(new CompanyConverter()));
VerifyJsonWriter
A VerifyJsonWriter is passed in to the Write methods. It exposes context and helper methods to the JsonConverter. For example:
Counterproperty that gives programmatic access to the counting behavior used by Guid, Date, and Id scrubbing.Serializerproperty that exposes the currentJsonSerializer.Serialize(object value)is a convenience method that callsJsonSerializer.Serializepassing in the writer instance and thevalueparameter.WriteProperty<T, TMember>(T target, TMember value, string name)method that writes a property name and value while respecting other custom serialization settings eg member converters, ignore rules etc.
Testing JsonConverters
WriteOnlyJsonConverter has a Execute methods that executes a JsonConverter:
namespace VerifyTests;
public abstract partial class WriteOnlyJsonConverter
{
public static string Execute<TConverter>(
object target,
VerifySettings? settings = null)
where TConverter : WriteOnlyJsonConverter, new() =>
Execute(new TConverter(), target, settings);
public static string Execute<TConverter>(TConverter converter, object target, VerifySettings? settings = null)
where TConverter : WriteOnlyJsonConverter
{
settings ??= new();
settings.UseStrictJson();
var builder = new StringBuilder("{");
using var counter = Counter.Start();
using (var writer = new VerifyJsonWriter(builder, settings, counter))
{
converter.Write(writer, target);
}
builder.Append('}');
return builder.ToString();
}
}
This can be used to test a JsonConverter.
Given the following JsonConverter:
class CompanyConverter :
WriteOnlyJsonConverter<Company>
{
public override void Write(VerifyJsonWriter writer, Company company)
{
writer.WriteMember(company, company.Name, "Name");
writer.WriteMember(company, company.Employees, "Employees");
}
}
It can be tested with:
[Fact]
public Task Test()
{
var company = new Company(
"Company Name",
Employees:
[
"Employee1",
"Employee2"
]);
var result = WriteOnlyJsonConverter.Execute<CompanyConverter>(company);
return VerifyJson(result);
}
Json converters often have instance level configuration or contextual settings.
class CompanyConverter :
WriteOnlyJsonConverter<Company>
{
bool ignoreEmployees;
public CompanyConverter()
{
}
public CompanyConverter(bool ignoreEmployees) =>
this.ignoreEmployees = ignoreEmployees;
public override void Write(VerifyJsonWriter writer, Company company)
{
writer.WriteMember(company, company.Name, "Name");
if (!ignoreEmployees)
{
if (writer.Context.TryGetValue("IgnoreCompanyEmployees", out var value))
{
if (value is true)
{
return;
}
}
writer.WriteMember(company, company.Employees, "Employees");
}
}
}
public static class CompanyConverterSettings
{
public static void IgnoreCompanyEmployees(this VerifySettings settings) =>
settings.Context["IgnoreCompanyEmployees"] = true;
public static SettingsTask IgnoreCompanyEmployees(this SettingsTask settings)
{
settings.CurrentSettings.IgnoreCompanyEmployees();
return settings;
}
}
These can be tested:
[Fact]
public Task TestWithConverterInstance()
{
var company = new Company(
"Company Name",
Employees:
[
"Employee1",
"Employee2"
]);
var converter = new CompanyConverter(ignoreEmployees: true);
var result = WriteOnlyJsonConverter.Execute(converter, company);
return VerifyJson(result);
}
[Fact]
public Task TestWithSettings()
{
var company = new Company(
"Company Name",
Employees:
[
"Employee1",
"Employee2"
]);
var settings = new VerifySettings();
settings.IgnoreCompanyEmployees();
var result = WriteOnlyJsonConverter.Execute<CompanyConverter>(company, settings);
return VerifyJson(result);
}
Scoped settings
[Fact]
public Task ScopedSerializer()
{
var person = new Person
{
GivenNames = "John",
FamilyName = "Smith"
};
var settings = new VerifySettings();
settings.AddExtraSettings(_ => _.TypeNameHandling = TypeNameHandling.All);
return Verify(person, settings);
}
[Fact]
public Task ScopedSerializerFluent()
{
var person = new Person
{
GivenNames = "John",
FamilyName = "Smith"
};
return Verify(person)
.AddExtraSettings(_ => _.TypeNameHandling = TypeNameHandling.All);
}
Result:
{
$type: VerifyObjectSamples.Person,
GivenNames: John,
FamilyName: Smith
}
Ignoring a type
To ignore all members that match a certain type:
[Fact]
public Task IgnoreType()
{
var target = new IgnoreTypeTarget
{
ToIgnore = new()
{
Property = "Value"
},
ToIgnoreNullable = new()
{
Property = "Value"
},
ToIgnoreByInterface = new()
{
Property = "Value"
},
ToIgnoreByBase = new()
{
Property = "Value"
},
ToIgnoreByBaseGeneric = new()
{
Property = "Value"
},
ToIgnoreByType = new()
{
Property = "Value"
},
ToInclude = new()
{
Property = "Value"
},
ToIncludeNullable = new()
{
Property = "Value"
},
ToIgnoreStruct = new("Value"),
ToIgnoreStructNullable = new("Value"),
ToIncludeStruct = new("Value"),
ToIncludeStructNullable = new("Value")
};
var settings = new VerifySettings();
settings.IgnoreMembersWithType<ToIgnore>();
settings.IgnoreMembersWithType<ToIgnoreByType>();
settings.IgnoreMembersWithType<InterfaceToIgnore>();
settings.IgnoreMembersWithType<BaseToIgnore>();
settings.IgnoreMembersWithType(typeof(BaseToIgnoreGeneric<>));
settings.IgnoreMembersWithType<ToIgnoreStruct>();
return Verify(target, settings);
}
[Fact]
public Task IgnoreTypeFluent()
{
var target = new IgnoreTypeTarget
{
ToIgnore = new()
{
Property = "Value"
},
ToIgnoreNullable = new()
{
Property = "Value"
},
ToIgnoreByInterface = new()
{
Property = "Value"
},
ToIgnoreByBase = new()
{
Property = "Value"
},
ToIgnoreByBaseGeneric = new()
{
Property = "Value"
},
ToIgnoreByType = new()
{
Property = "Value"
},
ToInclude = new()
{
Property = "Value"
},
ToIncludeNullable = new()
{
Property = "Value"
},
ToIgnoreStruct = new("Value"),
ToIgnoreStructNullable = new("Value"),
ToIncludeStruct = new("Value"),
ToIncludeStructNullable = new("Value")
};
return Verify(target)
.IgnoreMembersWithType<ToIgnore>()
.IgnoreMembersWithType<ToIgnoreByType>()
.IgnoreMembersWithType<InterfaceToIgnore>()
.IgnoreMembersWithType<BaseToIgnore>()
.IgnoreMembersWithType(typeof(BaseToIgnoreGeneric<>))
.IgnoreMembersWithType<ToIgnoreStruct>();
}
Or globally:
VerifierSettings.IgnoreMembersWithType<ToIgnore>();
Result:
{
ToInclude: {
Property: Value
},
ToIncludeNullable: {
Property: Value
},
ToIncludeStruct: {
Property: Value
},
ToIncludeStructNullable: {
Property: Value
}
}
Scrub a type
To scrub all members that match a certain type:
[Fact]
public Task ScrubType()
{
var target = new IgnoreTypeTarget
{
ToIgnore = new()
{
Property = "Value"
},
ToIgnoreNullable = new()
{
Property = "Value"
},
ToIgnoreByInterface = new()
{
Property = "Value"
},
ToIgnoreByBase = new()
{
Property = "Value"
},
ToIgnoreByBaseGeneric = new()
{
Property = "Value"
},
ToIgnoreByType = new()
{
Property = "Value"
},
ToInclude = new()
{
Property = "Value"
},
ToIncludeNullable = new()
{
Property = "Value"
},
ToIgnoreStruct = new("Value"),
ToIgnoreStructNullable = new("Value"),
ToIncludeStruct = new("Value"),
ToIncludeStructNullable = new("Value")
};
var settings = new VerifySettings();
settings.ScrubMembersWithType<ToIgnore>();
settings.ScrubMembersWithType<ToIgnoreByType>();
settings.ScrubMembersWithType<InterfaceToIgnore>();
settings.ScrubMembersWithType<BaseToIgnore>();
settings.ScrubMembersWithType(typeof(BaseToIgnoreGeneric<>));
settings.ScrubMembersWithType<ToIgnoreStruct>();
return Verify(target, settings);
}
[Fact]
public Task ScrubTypeFluent()
{
var target = new IgnoreTypeTarget
{
ToIgnore = new()
{
Property = "Value"
},
ToIgnoreNullable = new()
{
Property = "Value"
},
ToIgnoreByInterface = new()
{
Property = "Value"
},
ToIgnoreByBase = new()
{
Property = "Value"
},
ToIgnoreByBaseGeneric = new()
{
Property = "Value"
},
ToIgnoreByType = new()
{
Property = "Value"
},
ToInclude = new()
{
Property = "Value"
},
ToIncludeNullable = new()
{
Property = "Value"
},
ToIgnoreStruct = new("Value"),
ToIgnoreStructNullable = new("Value"),
ToIncludeStruct = new("Value"),
ToIncludeStructNullable = new("Value")
};
return Verify(target)
.ScrubMembersWithType<ToIgnore>()
.ScrubMembersWithType<ToIgnoreByType>()
.ScrubMembersWithType<InterfaceToIgnore>()
.ScrubMembersWithType<BaseToIgnore>()
.ScrubMembersWithType(typeof(BaseToIgnoreGeneric<>))
.ScrubMembersWithType<ToIgnoreStruct>();
}
Or globally:
VerifierSettings.ScrubMembersWithType<ToIgnore>();
Result:
{
ToIgnore: {Scrubbed},
ToIgnoreByType: {Scrubbed},
ToIgnoreByInterface: {Scrubbed},
ToIgnoreByBase: {Scrubbed},
ToIgnoreByBaseGeneric: {Scrubbed},
ToIgnoreNullable: {Scrubbed},
ToIgnoreStruct: {Scrubbed},
ToIgnoreStructNullable: {Scrubbed},
ToInclude: {
Property: Value
},
ToIncludeNullable: {
Property: Value
},
ToIncludeStruct: {
Property: Value
},
ToIncludeStructNullable: {
Property: Value
}
}
Ignoring an instance
To ignore instances of a type based on delegate:
[Fact]
public Task AddIgnoreInstance()
{
var target = new IgnoreInstanceTarget
{
ToIgnore = new()
{
Property = "Ignore"
},
ToInclude = new()
{
Property = "Include"
}
};
var settings = new VerifySettings();
settings.IgnoreInstance<Instance>(_ => _.Property == "Ignore");
return Verify(target, settings);
}
[Fact]
public Task AddIgnoreInstanceFluent()
{
var target = new IgnoreInstanceTarget
{
ToIgnore = new()
{
Property = "Ignore"
},
ToInclude = new()
{
Property = "Include"
}
};
return Verify(target)
.IgnoreInstance<Instance>(_ => _.Property == "Ignore");
}
Or globally:
VerifierSettings.IgnoreInstance<Instance>(_ => _.Property == "Ignore");
Result:
{
ToInclude: {
Property: Include
}
}
Scrub a instance
To scrub instances of a type based on delegate:
[Fact]
public Task AddScrubInstance()
{
var target = new IgnoreInstanceTarget
{
ToIgnore = new()
{
Property = "Ignore"
},
ToInclude = new()
{
Property = "Include"
}
};
var settings = new VerifySettings();
settings.ScrubInstance<Instance>(_ => _.Property == "Ignore");
return Verify(target, settings);
}
[Fact]
public Task AddScrubInstanceFluent()
{
var target = new IgnoreInstanceTarget
{
ToIgnore = new()
{
Property = "Ignore"
},
ToInclude = new()
{
Property = "Include"
}
};
return Verify(target)
.ScrubInstance<Instance>(_ => _.Property == "Ignore");
}
Or globally:
VerifierSettings.ScrubInstance<Instance>(_ => _.Property == "Ignore");
Result:
{
ToIgnore: {Scrubbed},
ToInclude: {
Property: Include
}
}
Ignore member by expressions
To ignore members of a certain type using an expression:
[Fact]
public Task IgnoreMemberByExpression()
{
var target = new IgnoreExplicitTarget
{
Include = "Value",
Field = "Value",
Property = "Value",
PropertyWithPropertyName = "Value"
};
var settings = new VerifySettings();
settings.IgnoreMembers<IgnoreExplicitTarget>(
_ => _.Property,
_ => _.PropertyWithPropertyName,
_ => _.Field,
_ => _.GetOnlyProperty,
_ => _.PropertyThatThrows);
return Verify(target, settings);
}
[Fact]
public Task IgnoreMemberByExpressionFluent()
{
var target = new IgnoreExplicitTarget
{
Include = "Value",
Field = "Value",
Property = "Value"
};
return Verify(target)
.IgnoreMembers<IgnoreExplicitTarget>(
_ => _.Property,
_ => _.Field,
_ => _.GetOnlyProperty,
_ => _.PropertyThatThrows);
}
Or globally
VerifierSettings.IgnoreMembers<IgnoreExplicitTarget>(
_ => _.Property,
_ => _.PropertyWithPropertyName,
_ => _.Field,
_ => _.GetOnlyProperty,
_ => _.PropertyThatThrows);
Result:
{
Include: Value
}
Scrub member by expressions
To scrub members of a certain type using an expression:
[Fact]
public Task ScrubMemberByExpression()
{
var target = new IgnoreExplicitTarget
{
Include = "Value",
Field = "Value",
Property = "Value",
PropertyWithPropertyName = "Value"
};
var settings = new VerifySettings();
settings.ScrubMembers<IgnoreExplicitTarget>(
_ => _.Property,
_ => _.PropertyWithPropertyName,
_ => _.Field,
_ => _.GetOnlyProperty,
_ => _.PropertyThatThrows);
return Verify(target, settings);
}
[Fact]
public Task ScrubMemberByExpressionFluent()
{
var target = new IgnoreExplicitTarget
{
Include = "Value",
Field = "Value",
Property = "Value"
};
return Verify(target)
.ScrubMembers<IgnoreExplicitTarget>(
_ => _.Property,
_ => _.Field,
_ => _.GetOnlyProperty,
_ => _.PropertyThatThrows);
}
Or globally
VerifierSettings.ScrubMembers<IgnoreExplicitTarget>(
_ => _.Property,
_ => _.PropertyWithPropertyName,
_ => _.Field,
_ => _.GetOnlyProperty,
_ => _.PropertyThatThrows);
Result:
{
Field: {Scrubbed},
Include: Value,
Property: {Scrubbed},
_Custom: {Scrubbed},
GetOnlyProperty: {Scrubbed},
PropertyThatThrows: {Scrubbed}
}
Ignore member by name
To ignore members of a certain type using type and name:
[Fact]
public Task IgnoreMemberByName()
{
var target = new IgnoreExplicitTarget
{
Include = "Value",
Field = "Value",
Property = "Value",
PropertyByName = "Value"
};
var settings = new VerifySettings();
// For all types
settings.IgnoreMember("PropertyByName");
// For a specific type
settings.IgnoreMember(typeof(IgnoreExplicitTarget), "Property");
// For a specific type generic
settings.IgnoreMember<IgnoreExplicitTarget>("Field");
// For a specific type with expression
settings.IgnoreMember<IgnoreExplicitTarget>(_ => _.PropertyThatThrows);
return Verify(target, settings);
}
[Fact]
public Task IgnoreMemberByNameFluent()
{
var target = new IgnoreExplicitTarget
{
Include = "Value",
Field = "Value",
Property = "Value",
PropertyByName = "Value"
};
return Verify(target)
// For all types
.IgnoreMember("PropertyByName")
// For a specific type
.IgnoreMember(typeof(IgnoreExplicitTarget), "Property")
// For a specific type generic
.IgnoreMember<IgnoreExplicitTarget>("Field")
// For a specific type with expression
.IgnoreMember<IgnoreExplicitTarget>(_ => _.PropertyThatThrows);
}
Or globally:
// For all types
VerifierSettings.IgnoreMember("PropertyByName");
// For a specific type
VerifierSettings.IgnoreMember(typeof(IgnoreExplicitTarget), "Property");
// For a specific type generic
VerifierSettings.IgnoreMember<IgnoreExplicitTarget>("Field");
// For a specific type with expression
VerifierSettings.IgnoreMember<IgnoreExplicitTarget>(_ => _.PropertyThatThrows);
Result:
{
Include: Value,
GetOnlyProperty: asd
}
Scrub member by name
To scrub members of a certain type using type and name:
[Fact]
public Task ScrubMemberByName()
{
var target = new IgnoreExplicitTarget
{
Include = "Value",
Field = "Value",
Property = "Value",
PropertyByName = "Value"
};
var settings = new VerifySettings();
// For all types
settings.ScrubMember("PropertyByName");
// For a specific type
settings.ScrubMember(typeof(IgnoreExplicitTarget), "Property");
// For a specific type generic
settings.ScrubMember<IgnoreExplicitTarget>("Field");
// For a specific type with expression
settings.ScrubMember<IgnoreExplicitTarget>(_ => _.PropertyThatThrows);
return Verify(target, settings);
}
[Fact]
public Task ScrubMemberByNameFluent()
{
var target = new IgnoreExplicitTarget
{
Include = "Value",
Field = "Value",
Property = "Value",
PropertyByName = "Value"
};
return Verify(target)
// For all types
.ScrubMember("PropertyByName")
// For a specific type
.ScrubMember(typeof(IgnoreExplicitTarget), "Property")
// For a specific type generic
.ScrubMember<IgnoreExplicitTarget>("Field")
// For a specific type with expression
.ScrubMember<IgnoreExplicitTarget>(_ => _.PropertyThatThrows);
}
Or globally:
// For all types
VerifierSettings.ScrubMember("PropertyByName");
// For a specific type
VerifierSettings.ScrubMember(typeof(IgnoreExplicitTarget), "Property");
// For a specific type generic
VerifierSettings.ScrubMember<IgnoreExplicitTarget>("Field");
// For a specific type with expression
VerifierSettings.ScrubMember<IgnoreExplicitTarget>(_ => _.PropertyThatThrows);
Result:
{
Field: {Scrubbed},
Include: Value,
Property: {Scrubbed},
PropertyByName: {Scrubbed},
GetOnlyProperty: asd,
PropertyThatThrows: {Scrubbed}
}
Ignore member by predicate
To ignore members of a certain type using a predicate function:
[Fact]
public Task IgnoreMemberByPredicate()
{
var target = new IgnoreExplicitTarget
{
Include = "Value",
Field = "Value",
Property = "Value",
PropertyByName = "Value"
};
var settings = new VerifySettings();
settings.IgnoreMembers(_ => _ is "Field" or "Property");
settings.IgnoreMembers(_ => _.Name is "PropertyByName" or "PropertyThatThrows");
return Verify(target, settings);
}
[Fact]
public Task IgnoreMemberByPredicateFluent()
{
var target = new IgnoreExplicitTarget
{
Include = "Value",
Field = "Value",
Property = "Value",
PropertyByName = "Value"
};
var settings = new VerifySettings();
return Verify(target, settings)
.IgnoreMembers(_ => _ is "Field" or "Property")
.IgnoreMembers(_ => _.Name is "PropertyByName" or "PropertyThatThrows");
}
[Fact]
public Task IgnoreDictionaryByPredicate()
{
var settings = new VerifySettings();
settings.IgnoreMembers(name => name is "Ignore");
var target = new Dictionary<string, object>
{
{
"Include", new Dictionary<string, string>
{
{
"Ignore", "Value1"
},
{
"Key1", "Value2"
}
}
},
{
"Ignore", "Value3"
},
{
"Key2", "Value4"
}
};
return Verify(target, settings);
}
Or globally:
VerifierSettings.IgnoreMembers(
_=>_.DeclaringType == typeof(TargetClass) &&
_.Name == "Proprty");
Result:
{
Include: Value,
GetOnlyProperty: asd
}
Scrub member by predicate
To scrub members of a certain type using a predicate function:
[Fact]
public Task ScrubMemberByPredicate()
{
var target = new IgnoreExplicitTarget
{
Include = "Value",
Field = "Value",
Property = "Value",
PropertyByName = "Value"
};
var settings = new VerifySettings();
settings.ScrubMembers(_ => _ is "Field" or "Property");
settings.ScrubMembers(_ => _.Name is "PropertyByName" or "PropertyThatThrows");
return Verify(target, settings);
}
[Fact]
public Task ScrubMemberByPredicateFluent()
{
var target = new IgnoreExplicitTarget
{
Include = "Value",
Field = "Value",
Property = "Value",
PropertyByName = "Value"
};
var settings = new VerifySettings();
return Verify(target, settings)
.ScrubMembers(name => name is "Field" or "Property")
.ScrubMembers(member => member.Name is "PropertyByName" or "PropertyThatThrows");
}
[Fact]
public Task ScrubDictionaryByPredicate()
{
var settings = new VerifySettings();
settings.ScrubMembers(name => name is "Ignore");
var target = new Dictionary<string, object>
{
{
"Include", new Dictionary<string, string>
{
{
"Ignore", "Value1"
},
{
"Key1", "Value2"
}
}
},
{
"Ignore", "Value3"
},
{
"Key2", "Value4"
}
};
return Verify(target, settings);
}
Or globally:
VerifierSettings.ScrubMembers(
_=>_.DeclaringType == typeof(TargetClass) &&
_.Name == "Proprty");
Result:
{
Field: {Scrubbed},
Include: Value,
Property: {Scrubbed},
PropertyByName: {Scrubbed},
GetOnlyProperty: asd,
PropertyThatThrows: {Scrubbed}
}
Converting a member
The value of a member can be mutated before serialization:
[ModuleInitializer]
public static void MemberConverterByExpressionInit()
{
// using only the member
VerifierSettings.MemberConverter<MemberTarget, string>(
expression: _ => _.Field,
converter: _ => $"{_}_Suffix");
// using target and member
VerifierSettings.MemberConverter<MemberTarget, string>(
expression: _ => _.Property,
converter: (target, member) => $"{target}_{member}_Suffix");
}
[Fact]
public Task MemberConverterByExpression()
{
var input = new MemberTarget
{
Field = "FieldValue",
Property = "PropertyValue"
};
return Verify(input);
}