I'm stuck with what I thought was an easy example. I want to assert that a collection of objects contains an object that is equivalent to a given object. like: 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
I want to compare based on the objects values - just like how ShouldBeEquivalentTo
and ShouldAllBeEquivalentTo
work. Should not be necessary to write my own equality comparer.
BR Matthias
I finally had the time to implement this feature and it is now available with version 5.6.0 of FluentAssertions .
This now works!
var objectList = new List<SomeClass> { new SomeClass("A"), new SomeClass("B"), new SomeClass("C") };
objectList.Should().ContainEquivalentOf(new SomeClass("A"));
BR Matthias
It seems like I was too naive and there is in fact no method that does quite what I want to have. Thx @Nkosi for pointing out.
Just to round this topic up: We ended up with something like
objectList.Should().Contain(dto=>dto.Id == expectedDto.Id).Which.ShouldBeEquivalentTo(expectedDto)
This only works (edit: beautifully) when you have some kind of unique identifier (id, name, etc.). But at least it uses the build in ShouldBeEquivalentTo
for all the other properties!
I created afeature request .
Thx for all the input!
BR Matthias
You could do something like:
objectList2.Should().Contain(x => x.Property == "B");
where Property
is replaced by whichever property is set by the constructor of SomeClass
.
You can use the already available functionality of framework to achieve the desired behavior
This is an ugly hack but should get the job done.
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);
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.