diff --git a/Src/FluentAssertions/Equivalency/SelfReferenceEquivalencyOptions.cs b/Src/FluentAssertions/Equivalency/SelfReferenceEquivalencyOptions.cs
index f3e9fe9c62..db6097d3b8 100644
--- a/Src/FluentAssertions/Equivalency/SelfReferenceEquivalencyOptions.cs
+++ b/Src/FluentAssertions/Equivalency/SelfReferenceEquivalencyOptions.cs
@@ -427,17 +427,19 @@ public TSelf AllowingInfiniteRecursion()
///
/// Clears all selection rules, including those that were added by default.
///
- public void WithoutSelectionRules()
+ public TSelf WithoutSelectionRules()
{
selectionRules.Clear();
+ return (TSelf)this;
}
///
/// Clears all matching rules, including those that were added by default.
///
- public void WithoutMatchingRules()
+ public TSelf WithoutMatchingRules()
{
matchingRules.Clear();
+ return (TSelf)this;
}
///
diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net47.verified.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net47.verified.txt
index 71fa616938..39344dce75 100644
--- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net47.verified.txt
+++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net47.verified.txt
@@ -957,8 +957,8 @@ namespace FluentAssertions.Equivalency
public TSelf WithStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { }
public TSelf WithTracing(FluentAssertions.Equivalency.Tracing.ITraceWriter writer = null) { }
public TSelf WithoutAutoConversionFor(System.Linq.Expressions.Expression> predicate) { }
- public void WithoutMatchingRules() { }
- public void WithoutSelectionRules() { }
+ public TSelf WithoutMatchingRules() { }
+ public TSelf WithoutSelectionRules() { }
public TSelf WithoutStrictOrdering() { }
public TSelf WithoutStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { }
public class Restriction
diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net6.0.verified.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net6.0.verified.txt
index 6d29bd1c3a..05e30d6602 100644
--- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net6.0.verified.txt
+++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net6.0.verified.txt
@@ -970,8 +970,8 @@ namespace FluentAssertions.Equivalency
public TSelf WithStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { }
public TSelf WithTracing(FluentAssertions.Equivalency.Tracing.ITraceWriter writer = null) { }
public TSelf WithoutAutoConversionFor(System.Linq.Expressions.Expression> predicate) { }
- public void WithoutMatchingRules() { }
- public void WithoutSelectionRules() { }
+ public TSelf WithoutMatchingRules() { }
+ public TSelf WithoutSelectionRules() { }
public TSelf WithoutStrictOrdering() { }
public TSelf WithoutStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { }
public class Restriction
diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.0.verified.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.0.verified.txt
index c39d7e7f89..44f9a2d9d1 100644
--- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.0.verified.txt
+++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.0.verified.txt
@@ -950,8 +950,8 @@ namespace FluentAssertions.Equivalency
public TSelf WithStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { }
public TSelf WithTracing(FluentAssertions.Equivalency.Tracing.ITraceWriter writer = null) { }
public TSelf WithoutAutoConversionFor(System.Linq.Expressions.Expression> predicate) { }
- public void WithoutMatchingRules() { }
- public void WithoutSelectionRules() { }
+ public TSelf WithoutMatchingRules() { }
+ public TSelf WithoutSelectionRules() { }
public TSelf WithoutStrictOrdering() { }
public TSelf WithoutStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { }
public class Restriction
diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.1.verified.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.1.verified.txt
index 34e0f4b77d..eb06a6654b 100644
--- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.1.verified.txt
+++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.1.verified.txt
@@ -957,8 +957,8 @@ namespace FluentAssertions.Equivalency
public TSelf WithStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { }
public TSelf WithTracing(FluentAssertions.Equivalency.Tracing.ITraceWriter writer = null) { }
public TSelf WithoutAutoConversionFor(System.Linq.Expressions.Expression> predicate) { }
- public void WithoutMatchingRules() { }
- public void WithoutSelectionRules() { }
+ public TSelf WithoutMatchingRules() { }
+ public TSelf WithoutSelectionRules() { }
public TSelf WithoutStrictOrdering() { }
public TSelf WithoutStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { }
public class Restriction
diff --git a/Tests/FluentAssertions.Equivalency.Specs/SelectionRulesSpecs.cs b/Tests/FluentAssertions.Equivalency.Specs/SelectionRulesSpecs.cs
new file mode 100644
index 0000000000..7e31ed3481
--- /dev/null
+++ b/Tests/FluentAssertions.Equivalency.Specs/SelectionRulesSpecs.cs
@@ -0,0 +1,66 @@
+using System;
+using FluentAssertions.Equivalency.Matching;
+using FluentAssertions.Equivalency.Ordering;
+using FluentAssertions.Equivalency.Selection;
+using Xunit;
+
+namespace FluentAssertions.Equivalency.Specs;
+
+public partial class SelectionRulesSpecs
+{
+ [Fact]
+ public void Public_methods_follow_fluent_syntax()
+ {
+ // Arrange
+ var subject = new Root();
+ var expected = new RootDto();
+
+ // Act / Assert
+ subject.Should().BeEquivalentTo(expected,
+ options => options
+ .AllowingInfiniteRecursion()
+ .ComparingByMembers(typeof(Root))
+ .ComparingByMembers()
+ .ComparingByValue(typeof(Customer))
+ .ComparingByValue()
+ .ComparingEnumsByName()
+ .ComparingEnumsByValue()
+ .ComparingRecordsByMembers()
+ .ComparingRecordsByValue()
+ .Excluding(r => r.Level)
+ .ExcludingFields()
+ .ExcludingMissingMembers()
+ .ExcludingNestedObjects()
+ .ExcludingNonBrowsableMembers()
+ .ExcludingProperties()
+ .IgnoringCyclicReferences()
+ .IgnoringNonBrowsableMembersOnSubject()
+ .Including(r => r.Level)
+ .IncludingAllDeclaredProperties()
+ .IncludingAllRuntimeProperties()
+ .IncludingFields()
+ .IncludingInternalFields()
+ .IncludingInternalProperties()
+ .IncludingNestedObjects()
+ .IncludingProperties()
+ .RespectingDeclaredTypes()
+ .RespectingRuntimeTypes()
+ .ThrowingOnMissingMembers()
+ .Using(new ExtensibilitySpecs.DoEquivalencyStep(() => { }))
+ .Using(new MustMatchByNameRule())
+ .Using(new AllFieldsSelectionRule())
+ .Using(new ByteArrayOrderingRule())
+ .Using(StringComparer.OrdinalIgnoreCase)
+ .WithAutoConversion()
+ .WithAutoConversionFor(_ => false)
+ .WithoutAutoConversionFor(_ => true)
+ .WithoutMatchingRules()
+ .WithoutSelectionRules()
+ .WithoutStrictOrdering()
+ .WithoutStrictOrderingFor(r => r.Level)
+ .WithStrictOrdering()
+ .WithStrictOrderingFor(r => r.Level)
+ .WithTracing()
+ );
+ }
+}
diff --git a/docs/_pages/releases.md b/docs/_pages/releases.md
index bc6eecded1..b8752b4320 100644
--- a/docs/_pages/releases.md
+++ b/docs/_pages/releases.md
@@ -59,6 +59,7 @@ sidebar:
* `EquivalencyAssertionOptions` to `EquivalencyOptions`
* `IEquivalencyAssertionOptions` to `IEquivalencyOptions`
* `SelfReferenceEquivalencyAssertionOptions` to `SelfReferenceEquivalencyOptions`
+* Allow fluently calling `WithoutMatchingRules` and `WithoutSelectionRules` while using `BeEquivalentTo` - [#2457](https://github.com/fluentassertions/fluentassertions/pull/2457)
### Breaking Changes (for extensions)
* Add `ForConstraint` to `IAssertionsScope` to support chaining `.ForConstraint()` after `.Then` - [#2324](https://github.com/fluentassertions/fluentassertions/pull/2324)