簡體   English   中英

使用C#流利接口的FsCheck生成的非空字符串生成器

[英]Not empty string generator with FsCheck using c# fluent interface

我正在嘗試創建一個非空字符串生成器,但是在運行測試時,我仍然有空字符串作為輸入。

這是我寫的代碼:

    [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 2.6.2.12296版,FsCheck 0.9.4.0版和FluentAssertions 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;
                });            
    }

也許您有一個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();
    }

注意,生成器周圍不需要多余的Func。 生成器已經是一種功能了,因此,僅創建一個生成器就不會執行任何代碼(或多或少),就像IEnumerable一樣。

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

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

        Spec.For(Any.OfType<NonEmptyString>(), assertIdIsNeverEmpty)
            .QuickCheckThrowOnFailure();

生成與正則表達式匹配的字符串是一個已解決的問題,但並非一帆風順。 FsCheck當前不直接支持它。 雖然我認為這將是一個很大的補充! 請參閱如何生成與給定正則表達式匹配的隨機字符串?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM