FluentAssertions:断言集合包含 "IsEquivalentTo" 的元素
FluentAssertions: Assert Collection contains Element that "IsEquivalentTo"
我一直坚持我认为是一个简单的例子。
我想断言对象集合包含一个与给定对象 等价 的对象。喜欢: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
我想根据对象值进行比较 - 就像 ShouldBeEquivalentTo
和 ShouldAllBeEquivalentTo
的工作方式一样。应该没有必要编写我自己的相等比较器。
BR 马蒂亚斯
你可以这样做:
objectList2.Should().Contain(x => x.Property == "B");
其中 Property
替换为 SomeClass
的构造函数设置的 属性。
您可以使用框架的现有功能来实现所需的行为
这是一个丑陋的 hack,但应该可以完成工作。
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);
}
}
现在可以了。查看接受的答案。停止支持此解决方法。 ^^
看来是我太天真了,其实并没有什么方法可以达到我想要的效果。感谢@Nkosi 指出。
只是为了总结这个话题:我们最终得到了类似
的东西
objectList.Should().Contain(dto=>dto.Id == expectedDto.Id).Which.ShouldBeEquivalentTo(expectedDto)
这仅在您拥有某种唯一标识符(id、名称等)时有效(编辑:精美)。但至少它为所有其他属性使用 ShouldBeEquivalentTo
中的构建!
我创建了一个feature request。
感谢所有的输入!
BR 马蒂亚斯
我终于有时间实现这个功能了,现在可以使用 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 马蒂亚斯
我一直坚持我认为是一个简单的例子。
我想断言对象集合包含一个与给定对象 等价 的对象。喜欢: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
我想根据对象值进行比较 - 就像 ShouldBeEquivalentTo
和 ShouldAllBeEquivalentTo
的工作方式一样。应该没有必要编写我自己的相等比较器。
BR 马蒂亚斯
你可以这样做:
objectList2.Should().Contain(x => x.Property == "B");
其中 Property
替换为 SomeClass
的构造函数设置的 属性。
您可以使用框架的现有功能来实现所需的行为
这是一个丑陋的 hack,但应该可以完成工作。
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);
}
}
现在可以了。查看接受的答案。停止支持此解决方法。 ^^
看来是我太天真了,其实并没有什么方法可以达到我想要的效果。感谢@Nkosi 指出。
只是为了总结这个话题:我们最终得到了类似
的东西objectList.Should().Contain(dto=>dto.Id == expectedDto.Id).Which.ShouldBeEquivalentTo(expectedDto)
这仅在您拥有某种唯一标识符(id、名称等)时有效(编辑:精美)。但至少它为所有其他属性使用 ShouldBeEquivalentTo
中的构建!
我创建了一个feature request。
感谢所有的输入!
BR 马蒂亚斯
我终于有时间实现这个功能了,现在可以使用 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 马蒂亚斯