问题描述
我一直在为 .NET 项目在 xUnit
项目中编写单元测试。因为我在同一个测试 (3000+) 中有很多参数组合,所以我决定使用 [ClassData(typeof(TestDataEnumerable))]
来生成不同的选项。
第一个测试只有两个参数,都是 enums
(后面很重要的常量)。第二个测试包含第三个 params
参数,其类型为 object
。
当我在 VS 测试资源管理器中运行测试时,我得到了测试的输出(不是实际代码)。
Namespace.FirstTest.GivenPrecondition_WhenCondition_ThenMethodReturns(firstParam:Standard,secondParam: Denied)
Namespace.SecondTest.GivenPrecondition_WhenCondition_ThenMethodReturns(firstParam: Standard,secondParam: Denied,thirdParams: [ObjectToStringResult,ObjectToStringResult])
以及显示测试方法下的下拉列表的测试资源管理器以及第一次测试的每个理论迭代。但是它没有显示第二个测试的所有迭代(使用非常量参数 - 它是一个 params 的事实不会影响这一点,测试只允许一个对象类型)。
TestClass >
> First Test
- IterationOne
- IterationTwo
Second Test
此外,当 XunitXML.TestLogger 的 XML 输出包含非常量类型时,它会在显示参数之前切断名称。
此类测试的代码如下,权限只是一个包含名称的类。它是一个类而不仅仅是一个允许继承的字符串值,我相信因此不能更改为常量类型。
[Theory]
[ClassData(typeof(PermissionPermutations))]
public void GivenUser_WhenUserHasCorrectPermissions_LoggedInMenuReturnsExpectedMenuItems(EUserType userType,ERovUserType rovUserType,params Permission[] permissions)
{
var user = UserBuilder.Create(userType,rovUserType)
.WithPermissions(permissions)
.Build();
var results = GetActualResults(user);
var expected = GetExpectedResults(user);
Assert.Equal(result.Count(),expected.Count());
Assert.All(results,(name) => Assert.Contains(name,expected));
Assert.All(expected,result));
}
public class PermissionPermutations : IEnumerable<object[]>
{
public IEnumerator<object[]> GetEnumerator()
{
foreach (var (userType,rovUserType) in UserTypeConstants.GetAllCombinations())
{
foreach (var permission in PermissionConstants.AllPermissions)
{
yield return new object[] { userType,rovUserType,permission };
}
}
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
PermissionConstants 类看起来像这样,所以总共存在 88 个权限(我用几千次迭代对其进行了测试,这不是导致 Explorer 隐藏迭代的迭代次数):
public static class PermissionConstants
{
public static Permission[] AllPermissions => new[]
{
new Permission { Name = "CanViewUsers" },new Permission { Name = "CanEditUsers" },... there are 88 of these total
};
}
UserTypeConstants 类看起来像这样,为了隐私,我更改了枚举的名称,但 EUserType 和 ERovUserType 只是枚举:
public static class UserTypeConstants
{
public static EUserType[] AllUserTypes => new[]
{
EUserType.Standard,EUserType.Admin,EUserType.Restricted,EUserType.SuperUser,EUserType.SystemUser
};
public static ERovUserType[] AllRovUserTypes => new[]
{
ERovUserType.Level0,ERovUserType.Level1,ERovUserType.Level2,ERovUserType.Level3,ERovUserType.Level4,ERovUserType.Level5
};
public static IEnumerable<(EUserType,ERovUserType)> GetAllCombinations() {
foreach (var userType in AllUserTypes)
{
foreach(var rovUserType in AllRovUserTypes)
{
yield return (userType,rovUserType);
}
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)