Мне не удалось воспроизвести проблему.Используя FSCheck 2.14.0, я попытался запустить следующее в файле F # Script:
#r "C:/Temp/nuget/packages/fscheck/lib/net452/FsCheck.dll"
open FsCheck
type LanguageConfiguration =
{ LeftLanguageName:string; RightLanguageName:string }
let charSet= "abc" // simplified for the example
let isValidString (s:string) =
null<>s && not (s |> Seq.exists (fun c -> not (charSet |> Seq.contains c)))
let createConfig left right = {LeftLanguageName= left; RightLanguageName= right}
let generateString= Arb.generate<string> |> Gen.filter isValidString
let generateConfig= createConfig <!> generateString <*> generateString
type Generators =
static member String() =
{ new Arbitrary<string>() with
override x.Generator = generateString }
static member LanguageConfiguration()=
{ new Arbitrary<LanguageConfiguration>() with
override x.Generator = generateConfig }
Arb.register<Generators>() |> ignore
Check.QuickThrowOnFailure (fun (n:LanguageConfiguration) ->
printfn "%A" n
true)
Это запускает 100 тестов, и вывод выглядит так:
{LeftLanguageName = "";
RightLanguageName = "";}
{LeftLanguageName = "";
RightLanguageName = "";}
{LeftLanguageName = "";
RightLanguageName = "";}
{LeftLanguageName = "";
RightLanguageName = "";}
{LeftLanguageName = "";
RightLanguageName = "";}
Это говорит о том, что есть еще одинпроблема с генерацией тестов (возможно, только в этой упрощенной демонстрации), которая заключается в том, что ваш вызов Gen.filter isValidString
в основном исключает все интересные входные данные, потому что они недопустимы.
Вы можете исправить это, выполнив генерацию строки по-другому- лучшим подходом было бы сгенерировать значение int
в качестве вашей длины, а затем в цикле сгенерировать символ из набора разрешенных символов и затем объединить эти символы (что дает вам только допустимые строки).