使用 BeEquivalentTo 时,我可以告诉 FluentAssertions 忽略 Equals 方法吗

Joh*_*eer 5 c# fluent-assertions

我有一个简单的类,它有两个属性并覆盖了 Equals 方法:

public class Person : IEquatable<Person>
{
    public Guid Id { get; set; }

    public string Name { get; set; }

    public override bool Equals(object obj)
    {
        return this.Equals(obj as Person);
    }

    public bool Equals(Person other)
    {
        return other != null &&
            this.Id.Equals(other.Id);
    }

    public override int GetHashCode()
    {
        return 2108858624 + EqualityComparer<Guid>.Default.GetHashCode(this.Id);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我创建了一个简单的测试,其中的Id值相同,但Name值不同。

[Fact]
public void PersonShouldNotBeEqual()
{
    var guid = Guid.NewGuid();

    var p1 = new Person { Id = guid, Name = "Me" };
    var p2 = new Person { Id = guid, Name = "You" };

    p1.Should().NotBeEquivalentTo(p2); // Fails
}
Run Code Online (Sandbox Code Playgroud)

我从文档中了解到,当它在类中被覆盖时,默认情况下BeEquivalentTo()使用该Equals()方法,但我还没有找到一种方法来否决它,因此实例通过它们的属性值进行比较。

除了下面的方法之外,是否可以在 FluentAssertions 中做到这一点?

[Fact]
public void PersonShouldBeEqual()
{
    var guid = Guid.NewGuid();

    var p1 = new Person { Id = guid, Name = "Me" };
    var p2 = new Person { Id = guid, Name = "You" };

    p1.Id.Should().Be(p2.Id);
    p1.Name.Should().Be(p2.Name);
}
Run Code Online (Sandbox Code Playgroud)

Psi*_*ter 11

您只需要在 EquivalencyAssertionOptions 中为您的类型覆盖相等比较器,如下所示:

p1.Should().BeEquivalentTo(p2, options => options.ComparingByMembers<Person>())

  • 如果“Person”有一个“Company”属性,并且我们也想在那里强制进行成员比较,该怎么办?此设置是否可以在全局级别上以某种方式应用,以便整个对象图受到影响? (2认同)