Генератор непустых строк с помощью FsCheck с использованием свободного интерфейса c #

Я пытаюсь создать не пустой генератор строк, но при запуске теста у меня все еще есть пустые строки в качестве входных данных.

Вот код, который я написал:

    [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.

Что, если я также хочу изменить генератор, чтобы он создавал непустые строки, соответствующие регулярному выражению?

[EDIT] Это код, который я использую для создания строк, содержащих буквы, но не содержащих специальных символов:

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

person Community    schedule 10.07.2014    source источник


Ответы (1)


Может у вас баг :) У меня работает следующее:

    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 в настоящее время не поддерживает его напрямую. Хотя я думаю, что это было бы отличным дополнением! См. Как сгенерировать случайные строки, соответствующие заданному регулярному выражению?

person Kurt Schelfthout    schedule 11.07.2014
comment
Действительно, это интересная тема (генерировать строки из регулярного выражения) - если ваше регулярное выражение - это просто замаскированный DFA, это (почти) тривиально - но, увы, большинство современных реализаций регулярных выражений могут делать гораздо больше, чем это - вы уже работаете над этим? - person Random Dev; 11.07.2014
comment
Неа. Если вам интересно, откройте вопрос, чтобы обсудить его. На самом деле, я думаю, что простая поддержка действительно регулярных выражений в любом случае принесет максимальную отдачу. - person Kurt Schelfthout; 11.07.2014
comment
На самом деле я не получал пустые строки, но не печатал символы, которые были напечатаны как пустые строки в окне вывода. - person ; 11.07.2014