是否有可能在没有for循环的情况下断言数组中是否存在一个或多个元素?

时间:2016-07-11 00:10:46

标签: c# xunit

我正在使用XUnit测试一个函数。虽然测试正确地完成了识别" System.DateTime"的存在的工作。在返回的Type []数组中,我必须通过遍历数组来完成。 (为什么测试我已经知道的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.");
}

2 个答案:

答案 0 :(得分:2)

LINQ快速完成了这项工作:

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

答案 1 :(得分:1)

您不一定需要自定义断言,因为您可以在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."
);