使用c#fluent接口的FsCheck不是空字符串生成器

时间:2014-07-10 10:10:28

标签: c# unit-testing fscheck

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

这是我写的代码:

    [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;
                });            
    }

1 个答案:

答案 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?