我正在尝试创建一个非空字符串生成器,但在运行测试时,我仍然将空字符串作为输入。
这是我写的代码:
[Test]
public void MyTest()
{
Func<Gen<string>> generateNotEmptyString = () =>
{
var gen = Any.OfType<string>()
.Where(name => !string.IsNullOrEmpty(name));
return gen;
};
Action<string> assertIdIsNeverEmpty = name =>
{
var id = MyService.CreateId(name);
id.Should().NotBeNullOrEmpty();
};
Spec.For(generateNotEmptyString(), assertIdIsNeverEmpty)
.QuickCheckThrowOnFailure()
}
我正在使用NUnit v.2.6.2.12296,FsCheck v.9.4.4.0和FluentAssertions v.3.0.90.0。
如果我还想修改生成器以使它不创建与正则表达式匹配的空字符串,该怎么办?
[编辑] 这是我用来创建包含字母但不包含特殊字符的字符串的代码:
private static Gen<NonEmptyString> GenerateValidNames()
{
return
Any.OfType<NonEmptyString>()
.Where(s =>
!s.Get.Contains("\r") &&
!s.Get.Contains("\n") &&
!s.Get.Contains("\t"))
.Where(s =>
{
var regEx = new Regex(@"^[A-Za-z]*$");
return regEx.Match(s.Get).Success;
});
}
答案 0 :(得分:3)
也许你有一个错误:)以下适用于我:
public void MyTest()
{
Gen<string> generateNotEmptyString = Any.OfType<string>()
.Where(name => !string.IsNullOrEmpty(name));
Action<string> assertIdIsNeverEmpty = name =>
{
Assert.False(String.IsNullOrEmpty(name));
};
Spec.For(generateNotEmptyString, assertIdIsNeverEmpty)
.QuickCheckThrowOnFailure();
}
请注意,您不需要在发电机周围使用额外的Func。生成器已经是一个功能,在封面下,所以只创建一个不会执行任何代码(或多或少),就像IEnumerable一样。
或者,使用内置的非空字符串生成器:
Action<NonEmptyString> assertIdIsNeverEmpty = name =>
{
Assert.False(String.IsNullOrEmpty(name.Get));
};
Spec.For(Any.OfType<NonEmptyString>(), assertIdIsNeverEmpty)
.QuickCheckThrowOnFailure();
生成与正则表达式匹配的字符串是一个已解决的问题,但不是直截了当的。 FsCheck目前不直接支持它。虽然我认为它会成为一个很好的补充!见How to generate random strings that match a given regexp?