我正在尝试创建一个非空字符串生成器,但在运行测试时我仍然有空字符串作为输入。
这是我写的代码:
[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. 0.9.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;
});
}
最佳答案
也许你有一个错误 :) 以下对我有用:
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?
关于c# - 使用 C# 流畅界面的 FsCheck 不是空字符串生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24673851/