传递一定大小的数组以使用xunit进行测试

时间:2019-08-29 18:59:09

标签: c# .net asp.net-core xunit

我需要有关使用xunit编写单元测试的帮助。我正在尝试测试数组长度不能大于20MB的验证

[Theory]
[InlineData((arrayGreaterThan20MB())]
public void Fail_when_documentSize_is_greater(byte[] documentSize)
{
    _getAccountFileViewModel.Content = documentSize;
}

私人功能

private static byte[] arrayGreaterThan20MB()
{
    byte[] arr = new byte[5000000000];
    return arr;
}

我不确定什么是最好的测试方法。尝试在内联数据中传递函数时出现错误。

错误“属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式”

2 个答案:

答案 0 :(得分:2)

只需在测试本身中声明数组,而不是尝试通过内联数据属性传递

[Theory]
public void Fail_when_documentSize_is_greater() {
    byte[] overSizedDocument =  new byte[5000000000];
    _getAccountFileViewModel.Content = overSizedDocument;

    //...
}

答案 1 :(得分:1)

不能将方法调用的结果用作属性的参数。这就是错误告诉您的内容。您只能传递常量或文字。例如这样的

[Theory]
[InlineData("a", "b")]
public void InlineDataTest(string first, string second)
{
    Assert.Equal("a", first);
    Assert.Equal("b", second);
}

XUnit还有一些其他属性,可以在这里为您提供帮助。例如。有一个MemberData属性,可让您指定提供测试数据的方法的方法名。请注意,它返回对象数组的 IEnumerable 。每个对象数组将用于一次调用测试方法。对象数组的内容是参数。例如:

[Theory]
[MemberData(nameof(DataGeneratorMethod))]
public void MemberDataTest(string first, string second)
{
    Assert.Equal("a", first);
    Assert.Equal("b", second);
}

public static IEnumerable<object[]> DataGeneratorMethod()
{
    var result = new List<object[]>();   // each item of this list will cause a call to your test method
    result.Add(new object[] {"a", "b"}); // "a" and "b" are parameters for one test method call
    return result;

    // or 
    // yield return new object[] {"a", "b"};
}

在上述情况下,最简单的方法就是调用在测试方法中创建测试数据的方法。

[Theory]
public void Fail_when_documentSize_is_greater()
{
    _getAccountFileViewModel.Content = arrayGreaterThan20MB();
}

还有另一个名为ClassData的属性,可以使用数据生成器类。 可以在this blog post

上找到更多详细信息。