Fluent Assertions 中的 Satisfy() 不适用于类对象集合

YMM*_*YMM 9 c# assertion fluent-assertions

我有一堂课:

public class TestClass
{
    public int Id { get; set; }
    
    public int CampusId { get; set; }
    
    public int CurrentStudentCount { get; set; }
    
    public int MaxStudentCount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以及该类的对象集合:

var collection = new[]
    {
        new TestClass
        {
            Id = 55,
            CampusId = 38,
            CurrentStudentCount = 1,
            MaxStudentCount = 2
        },
        new TestClass
        {
            Id = 127,
            CampusId = 38,
            CurrentStudentCount = 2,
            MaxStudentCount = 2
        },
        new TestClass
        {
            Id = 126,
            CampusId = 38,
            CurrentStudentCount = 2,
            MaxStudentCount = 2
        }
    };
Run Code Online (Sandbox Code Playgroud)

我想断言每个对象都CampusId等于 38:

collection.Should().Satisfy(i => i.CampusId == 38);
Run Code Online (Sandbox Code Playgroud)

但断言失败并显示以下消息:

预期集合满足所有谓词,但以下元素与任何谓词不匹配:

Index: 1, Element: TestClass

{
    CampusId = 38, 
    CurrentStudentCount = 2, 
    Id = 127, 
    MaxStudentCount = 2
}

Index: 2, Element: TestClass

{
    CampusId = 38, 
    CurrentStudentCount = 2, 
    Id = 126, 
    MaxStudentCount = 2
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*vić 9

Satisfy(和SatisfyRespectively) 需要集合中的每个元素都有一个 lambda。在你的情况下,这将是:

collection.Should().Satisfy(
    i => i.CampusId == 38,
    i => i.CampusId == 38,
    i => i.CampusId == 38
);
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用OnlyContain

collection.Should().OnlyContain(i => i.CampusId == 38);
Run Code Online (Sandbox Code Playgroud)

更新

对于版本6.5.0,还可以使用AllSatisfy

collection.Should().AllSatisfy(i => i.CampusId.Should().Be(38))
Run Code Online (Sandbox Code Playgroud)

  • 是的,“OnlyContain”断言所有元素都与谓词匹配。`collection.Should().OnlyContain(i => i.CampusId == 38 && i.CurrentStudentCount <= i.MaxStudentCount);`。关于“AllSatisfy”存在一个悬而未决的问题 https://github.com/ Fluentassertions/ Fluentassertions/issues/1179 (2认同)

Grz*_*lko 8

使用,根据https://fluidassertions.com/collections/AllSatisfy()在 v. 6.5.0 中添加。

在你的情况下,它将是:

collection.Should().AllSatisfy(
    i => i.CampusId.Should().Be(38)
);
Run Code Online (Sandbox Code Playgroud)

  • 我正在尝试使用 `i => i.CampusId == 38`。谢谢,现在可以了:) (2认同)