FluentAssertions:Assert Collection包含的元素是" IsEquivalentTo"

时间:2017-06-28 22:24:27

标签: c# fluent-assertions

我坚持认为这是一个简单的例子。 我想声明一个对象集合包含一个与给定对象等效的对象。喜欢:col.ShouldContainEquivalentTo(obj)

var objectList1 = new List<SomeClass> { new SomeClass("A"), new SomeClass("B"), new SomeClass("C") };
var objectList2 = new List<SomeClass> { new SomeClass("C"), new SomeClass("B"), new SomeClass("A") };

objectList1.ShouldAllBeEquivalentTo(objectList2); //this works
objectList2.ShouldContainEquivalentTo(new SomeClass("B")); //method does not exist. How can I achieve sthg like that

我想根据对象值进行比较 - 就像ShouldBeEquivalentToShouldAllBeEquivalentTo的工作方式一样。没有必要写我自己的平等比较器。

BR Matthias

4 个答案:

答案 0 :(得分:3)

我终于有时间实现此功能,version 5.6.0 of FluentAssertions现在可以使用它。

现在可以使用!

var objectList = new List<SomeClass> { new SomeClass("A"), new SomeClass("B"), new SomeClass("C") };
objectList.Should().ContainEquivalentOf(new SomeClass("A"));

马蒂亚斯(BR Matthias)

答案 1 :(得分:2)

看起来我太天真了,事实上没有一种方法可以做到我想要的。感谢@Nkosi指出。

只是围绕这个主题:我们最终得到了像

这样的东西
objectList.Should().Contain(dto=>dto.Id == expectedDto.Id).Which.ShouldBeEquivalentTo(expectedDto)

当你有某种唯一标识符(id,name等)时,这只能起作用(编辑:精美)。但至少它使用ShouldBeEquivalentTo中的构建用于所有其他属性!

我创建了一个feature request

所有输入的Thx!

BR Matthias

答案 2 :(得分:1)

您可以使用框架的现有功能来实现所需的行为

这是一个丑陋的黑客,但应该完成工作。

public static class FluentAssertionsEx {

    public static void ShouldContainEquivalentTo<T>(this IEnumerable<T> subject, object expectation, string because = "Expected subject to contain equivalent to provided object", params object[] becauseArgs) {
        var expectedCount = subject.Count();
        var actualCount = 0;
        try {
            foreach (var item in subject) {
                item.ShouldBeEquivalentTo(expectation);
            }
        } catch {
            actualCount++;
        }
        expectedCount.Should().NotBe(actualCount, because, becauseArgs);
    }
}

答案 3 :(得分:0)

您可以执行以下操作:

objectList2.Should().Contain(x => x.Property == "B");

其中PropertySomeClass的构造函数设置的任何属性替换。