我可以告诉 FluentAssertions 在使用 BeEquivalentTo 时忽略 Equals 方法吗
Can I tell FluentAssertions to ignore Equals method when using BeEquivalentTo
我有一个简单的 class,它有两个属性并覆盖了 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);
}
}
现在我创建了一个简单的测试,其中 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
}
我从文档中了解到 BeEquivalentTo()
在 class 中被覆盖时默认使用 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);
}
您只需要像这样在 EquivalencyAssertionOptions 中覆盖您的类型的相等比较器:
p1.Should().BeEquivalentTo(p2, options => options.ComparingByMembers<Person>())
您也可以使用动态对象。
[Fact]
public void PersonShouldNotBeEqual()
{
var guid = Guid.NewGuid();
var p1 = new Person { Id = guid, Name = "Me" };
dynamic p2 = new { Id = guid, Name = "You" };
p1.Should().NotBeEquivalentTo(p2);
dynamic p3 = new { Id = guid, Name = "Me" };
p1.Should().BeEquivalentTo(p3);
}
如果您还需要嵌套对象比较,也可以对它们使用 dynamic。
dynamic expected = new
{
Id = 123,
Name = "John Doe",
City = new {
Id = 456,
Name = "Paris"
Country = new {
Id = 789,
Name = France
}
}
};
我有一个简单的 class,它有两个属性并覆盖了 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);
}
}
现在我创建了一个简单的测试,其中 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
}
我从文档中了解到 BeEquivalentTo()
在 class 中被覆盖时默认使用 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);
}
您只需要像这样在 EquivalencyAssertionOptions 中覆盖您的类型的相等比较器:
p1.Should().BeEquivalentTo(p2, options => options.ComparingByMembers<Person>())
您也可以使用动态对象。
[Fact]
public void PersonShouldNotBeEqual()
{
var guid = Guid.NewGuid();
var p1 = new Person { Id = guid, Name = "Me" };
dynamic p2 = new { Id = guid, Name = "You" };
p1.Should().NotBeEquivalentTo(p2);
dynamic p3 = new { Id = guid, Name = "Me" };
p1.Should().BeEquivalentTo(p3);
}
如果您还需要嵌套对象比较,也可以对它们使用 dynamic。
dynamic expected = new
{
Id = 123,
Name = "John Doe",
City = new {
Id = 456,
Name = "Paris"
Country = new {
Id = 789,
Name = France
}
}
};