是否可以断言数组中存在一个或多个元素而没有 for 循环

本文关键字:元素 循环 for 一个 数组 断言 存在 是否 | 更新日期: 2023-09-27 17:56:19

我正在用XUnit测试一个函数。虽然测试正确地完成了识别返回的 Type[] 数组中是否存在"System.DateTime"的工作,但我必须通过循环遍历数组来做到这一点。 (为什么要测试我已经知道的日期时间属性是否存在?因为我正在通过玩一些我已经熟悉的代码来学习TDD。

是否有可以确认数组中元素存在的 Assert 函数?我问问题是因为,虽然它有效,但我不禁想知道除了循环遍历数组之外,是否有更有效或更紧凑的方法可以做到这一点。

我希望 Assert 中有一个未记录的功能,我可以利用它。

/// <summary>
/// This tests the "GetPropertyTypes(PropertyInfo[] properties)" function to 
/// confirm that any DateTime properties in the "TestClass" are confirmed as existing.
/// </summary>
[Fact]
public void ConfirmDateTimePropertiesInModelExist()
{
    // Arrange
    PropertyInfo[] propertiesInfos = typeof(TestClass).GetProperties();
    int dateTimeCount = 0;
    // Act
    // The names array the list of property types in "TestClass"
    Type[] propertyTypes = ExportToExcelUtilities.GetPropertyTypes(propertiesInfos);
    for (int i = 0; i < propertyTypes.Length; i++)
        if (propertyTypes[i] == typeof(DateTime))
            dateTimeCount++;
    // Assert
    // Assert that the names array contains one or more "System.DateTime" properties.
    Assert.True(dateTimeCount>0,
        "Existing DateTime properties were not identified in the class.");
}

是否可以断言数组中存在一个或多个元素而没有 for 循环

LINQ 可以快速完成此操作:

Assert.True(propertyTypes.Any(n => n == typeof(DateTime)))

您不一定需要自定义断言,因为您可以在Assert.True()中使用标准数组命令。

例如,您可以使用 Array.FindIndex() .

var index = Array.FindIndex(propertyTypes, t => t == typeof(DateTime));

如果索引大于 -1,则找到项目。因此,要在断言中使用它:

Assert.True(
    Array.FindIndex(propertyTypes, t => t == typeof(DateTime)) > -1,
    "Existing DateTime properties were not identified in the class."
);