Skip to main content
 首页 » 编程设计

c#之流利的断言;结合集合和对象图比较断言

2024年02月05日28mfryf

我正在尝试使用 FluentAssertions 来组合集合和对象图比较断言。

我有以下类(class)。

public class Contract 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

在集合中返回,就像这样。

ICollection<Contract> contracts = factory.BuildContracts(); 

然后我想确保该集合仅包含特定的 Contract对象。

contracts.Should().Contain(new Contract() { Id = id1, Name = "A" }); 

这行不通,我相信是因为 Contain正在使用 object.Equals而不是对象图比较(由 ShouldBeEquivalentTo 提供)。

我还需要断言该集合不包含特定对象,即

contracts.Should().NotContain(new Contract() { Id = id2, Name = "B" }); 

有效地给定一个包含未知数量项目的集合,我想确保;它包含许多特定项目,并且不包含许多特定项目。

用FluentAssertions提供的函数可以实现吗?

作为旁注,我不想覆盖 object.Equals出于此处讨论的原因。 Should I be using IEquatable to ease testing of factories?

请您参考如下方法:

据我从文档和我使用该框架的经验可以看出,它确实使用了 object.Equals。

在这种情况下,我倾向于使用 the collections documentation for v3.0 and higher 中引用的表达式谓词.

以下示例展示了如何确保集合仅包含特定的 Contract 对象,并断言该集合不包含特定对象。

[TestMethod] 
public void FluentAssertions_Should_Validate_Collections() { 
    //Arrange 
    var id1 = Guid.NewGuid(); 
    var id2 = Guid.NewGuid(); 
 
    var list = new List<Contract>{ 
        new Contract() { Id = id1, Name = "A" }, 
        new Contract() { Id = Guid.NewGuid(), Name = "B"} 
    }; 
 
    var factoryMock = new Mock<IContractFactory>(); 
    factoryMock.Setup(m => m.BuildContracts()).Returns(list); 
    var factory = factoryMock.Object; 
 
    //Act 
    var contracts = factory.BuildContracts(); 
 
    //Assert 
    contracts.Should() 
        .HaveCount(list.Count) 
        .And.Contain(c => c.Id == id1 && c.Name == "A") 
        .And.NotContain(c => c.Id == id2 && c.Name == "B"); 
}