我需要有关使用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表达式或数组创建表达式”
答案 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