使用 FluentAssertions 4.19.4,我通过实现自己的扩展方法解决了这个问题。
集合中的每个元素都针对预期元素单独声明,使用可以接受配置参数的 ShouldBeEquivalentTo 方法。
using FluentAssertions.Collections;
using FluentAssertions.Equivalency;
using FluentAssertions.Execution;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace FluentAssertions.Extensions
{
public static class FluentAssertionsHelper
{
public static AndWhichConstraint<TAssertions, T> Contain<TAssertions, T>(this SelfReferencingCollectionAssertions<T, TAssertions> colAssert,
T expected,
Func<EquivalencyAssertionOptions<T>, EquivalencyAssertionOptions<T>> config,
string because = "",
params object[] becauseArgs) where TAssertions : SelfReferencingCollectionAssertions<T, TAssertions>
{
var items = colAssert.Subject;
if (items == null)
{
Execute.Assertion.BecauseOf(because, becauseArgs).FailWith("Expected {context:collection} to contain {0}{reason}, but found {1}.", expected, items);
}
var containsItem = false;
using (var scope = new AssertionScope())
{
foreach (var item in items)
{
try
{
item.ShouldBeEquivalentTo(expected, config, because, becauseArgs);
}
catch (NullReferenceException) { }
var failures = scope.Discard();
if (!failures.Any())
{
containsItem = true;
break;
}
}
}
if (!containsItem)
{
Execute.Assertion.BecauseOf(because, becauseArgs).FailWith("Expected {context:collection} {0} to contain {1}{reason}.", items, expected);
}
return new AndWhichConstraint<TAssertions, T>((TAssertions)colAssert, items.Where(item => EqualityComparer<T>.Default.Equals(item, expected)));
}
}
}
然后您可以编写以下内容:
using FluentAssertions;
using FluentAssertions.Extensions;
collection.Should().Contain(item, config => config.Excluding(item => item.MyProperty));