如何使用AutoFixture生成仅包含字母数字的字符串
解决AutoFixture生成仅字母数字字符串的问题
有几种实用方法可以让AutoFixture只生成字母数字字符串,适配你的API输入约束:
方法1:自定义SpecimenBuilder
创建一个实现ISpecimenBuilder的类,重写Create方法生成符合要求的字符串:
public class AlphaNumericStringBuilder : ISpecimenBuilder { private static readonly char[] _alphaNumericChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".ToCharArray(); private readonly Random _random = new Random(); public object Create(object request, ISpecimenContext context) { var typeRequest = request as Type; if (typeRequest == typeof(string)) { var length = _random.Next(1, 20); // 可自定义字符串长度范围 return new string(Enumerable.Repeat(_alphaNumericChars, length) .Select(s => s[_random.Next(s.Length)]).ToArray()); } return new NoSpecimen(); } }
在测试中注册该Builder:
var fixture = new Fixture(); fixture.Customizations.Add(new AlphaNumericStringBuilder()); var alphaNumericString = fixture.Create<string>(); // 生成的字符串仅包含字母数字
方法2:使用[StringGenerator]特性
结合AutoFixture的[AutoData]特性,直接在测试参数上通过正则表达式约束字符串格式:
using AutoFixture.Xunit2; public class MyApiTests { [Theory, AutoData] public void TestApiMethod([StringGenerator(@"^[a-zA-Z0-9]+$")] string validInput) { // validInput 仅包含字母数字,可直接传入API方法测试 var result = TargetApiMethod(validInput); // 测试断言逻辑 } }
方法3:全局自定义Fixture的字符串生成规则
如果所有测试都需要字母数字字符串,可以全局修改Fixture的默认行为:
var fixture = new Fixture(); fixture.Customize<string>(c => c.FromFactory(() => { var random = new Random(); var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; return new string(Enumerable.Repeat(chars, random.Next(1, 20)) .Select(s => s[random.Next(s.Length)]).ToArray()); }));
后续调用fixture.Create<string>()都会生成仅包含字母数字的字符串。
内容的提问来源于stack exchange,提问作者user21364415
相关产品推荐
相关产品推荐

