c# - 使用 C# 流畅界面的 FsCheck 不是空字符串生成器

标签 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. 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/

相关文章:

c# - 如何使用 itextsharp 将 UTF-8 字符写入 pdf 文件?

c# - 在分隔符处拆分字节数组

c# - 在 FsCheck 中生成唯一字符串

f# - 为什么我在基于属性的测试中收到 "No arguments provided"错误?

c# - 代码中没有错误,但尝试更新表时没有发生任何更改

c# - 将复杂的数据结构从 C# 传递到 native dll

java - Spring Boot/Thymeleaf 单元测试 : Model attribute does not exist

c# - 为构建器类编写单元测试

visual-studio - 如何弄清楚为什么 ReSharper 在运行之前没有重建单元测试项目?

types - 如何使用 F# 语法将 Type 作为属性参数传递?