c# - 如何使用 FluentAssertions 控制字典成员的 "Equality"

标签 c# fluent-assertions

有没有办法通过 FluentAssertions 来控制如何比较字典的值是否相等?

我有一个类,其中一个属性是字典(字符串/ double )。我想比较该类的两个实例(预期的和实际的),并为字典成员指定如何确定“相等”。

假设我有一个如图所示的类:

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        var t1 = new Thing();
        t1.Name = "Bob";
        t1.Values.Add("Hello", 100.111);
        t1.Values.Add("There", 100.112);
        t1.Values.Add("World", 100.113);

        var t2 = new Thing();
        t2.Name = "Bob";
        t2.Values.Add("Hello", 100.111);
        t2.Values.Add("There", 100.112);
        t2.Values.Add("World", 100.1133);

        t1.Should().BeEquivalentTo(t2);
    }
}

public class Thing
{
    public string Name { get; set; }

    public Dictionary<string, double> Values { get; set; } = new Dictionary<string, double>();
}

我希望能够指定如何比较字典中的“世界”条目。实际上,这些值可能会非常大,或者在小数点后 10 位以上(但之后不会)相同,但我想我可能需要说“如果差异小于 1% 则相同”。

我喜欢 FluentAssertions 告诉我成员及其不同原因的方式,并尝试了自定义 IAssertionRule(使用 Options lambda),但这似乎只比较了类属性,而不是字典的成员。

我不拥有被比较的类,因此无法重写“相等”方法,而且我找不到指定自定义比较器 (IEquatable) 的方法 - 但我怀疑我会失去关于它们为何如此的流利细节不一样。

如果可能,但任何方法也适用于作为类属性的 double (而不是字典中的值),那没问题。

谢谢。

最佳答案

BeApproximately 可用于在可接受的精度范围内比较 double 值。将其与配置所有 double 精度一起使用应该可以满足所需的行为。

t1.Should().BeEquivalentTo(t2, options => options
    .Using<double>(ctx => 
        ctx.Subject.Should().BeApproximately(ctx.Expectation, ctx.Expectation * 0.01D))
    .WhenTypeIs<double>()
);

引用 Object graph comparison: Equivalency Comparison Behavior

关于c# - 如何使用 FluentAssertions 控制字典成员的 "Equality",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51005485/

相关文章:

c# - 使用 DataSource 属性在 DataGridView 中排序

c# - 使用诺基亚 map 的 Windows Phone 8 地理围栏

c# - Roslyn:如何获取未解析类型的候选命名空间

c# - 如何在 C# 中使用反射通过 ProgID 调用 COM 对象

c# - Fluent Assertions - null 和空字符串比较

c# - 为什么我的 TransactionScope 在测试期间没有得到尊重?

c# - 在 FluentAssertions 中自定义失败处理

c# - 如何在 C# 中比较字典列表的相等性

c# - 流利的断言 : How to check for key value pair with out case

c# - FluentAssertions 检查对象字段是否不相等?