使用c#fluent接口进行FsCheck的非空字符串生成器

使用c#fluent接口进行FsCheck的非空字符串生成器,c#,unit-testing,fscheck,C#,Unit Testing,Fscheck,我试图创建一个非空字符串生成器,但在运行测试时,我仍然有空字符串作为输入 以下是我编写的代码: [Test] public void MyTest() { Func<Gen<string>> generateNotEmptyString = () => { var gen = Any.OfType<string>() .Whe

我试图创建一个非空字符串生成器,但在运行测试时,我仍然有空字符串作为输入

以下是我编写的代码:

    [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()
    }
[测试]
公共无效MyTest()
{
Func generateEntertyString=()=>
{
var gen=Any.OfType()
.Where(name=>!string.IsNullOrEmpty(name));
返回发电机;
};
Action AssertedisNeverEmpty=name=>
{
var id=MyService.CreateId(名称);
id.Should().NotBeNullOrEmpty();
};
Spec.For(generateEntertyString(),assertedisNeverEmpty)
.QuickCheckThrowOnFailure()
}
我用的是NUnit v。2.6.2.12296,FsCheck v。0.9.4.0和流体组件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;
                });            
    }
专用静态Gen GenerateValidNames()
{
返回
Any.OfType()
。其中(s=>
!s.Get.Contains(“\r”)&&
!s.Get.Contains(“\n”)&&
!s.Get.Contains(“\t”))
。其中(s=>
{
var regEx=new regEx(@“^[A-Za-z]*$”);
返回regEx.Match(s.Get.Success);
});            
}
也许你有一个bug:)以下内容适合我:

    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();
    }
public void MyTest()
{
Gen GENERATENOTENTYSTRING=Any.OfType()
.Where(name=>!string.IsNullOrEmpty(name));
Action AssertedisNeverEmpty=name=>
{
Assert.False(String.IsNullOrEmpty(name));
};
规范(生成诱惑字符串,断言不空)
.QuickCheckThrowOnFailure();
}
注意:发电机周围不需要额外的Func。生成器已经是一个隐藏的函数,所以仅仅创建一个生成器不会执行任何代码(或多或少),就像IEnumerable一样

或者,使用内置的非空字符串生成器:

        Action<NonEmptyString> assertIdIsNeverEmpty = name =>
        {
                Assert.False(String.IsNullOrEmpty(name.Get));
        };

        Spec.For(Any.OfType<NonEmptyString>(), assertIdIsNeverEmpty)
            .QuickCheckThrowOnFailure();
Action-assertedisneverempty=name=>
{
False(String.IsNullOrEmpty(name.Get));
};
Spec.For(Any.OfType(),assertedisneverempty)
.QuickCheckThrowOnFailure();

生成与regexp匹配的字符串是一个已解决的问题,但并不简单。FsCheck目前不直接支持它。虽然我认为这将是一个伟大的补充!请参见

这确实是一个有趣的主题(从正则表达式生成字符串)-如果您的正则表达式只是一个伪装的DFA,那么这(几乎)是微不足道的-但是遗憾的是,大多数现代正则表达式实现可以做的远不止这些-您是否已经在处理这个问题了?不。如果您感兴趣,请打开一个问题进行讨论。事实上,我认为“只是”支持真正的正则表达式无论如何都会带来最大的回报。实际上,我没有收到空字符串,但没有收到在输出窗口中打印为空字符串的可打印字符。