Я определил тип с несколькими пользовательскими генераторами, чтобы FsCheck генерировал настраиваемые экземпляры нескольких типов. Но для одного из сложных типов я хочу сначала использовать генерацию FsCheck по умолчанию, а затем скорректировать результат. Вот (упрощенный) код:
type CustomGenerators =
static member FirstCustomType() = /* function that returns FirstCustomType */
static member SecondCustomType() =
Arb.generate<SecondCustomType>
|> Gen.map (fun x -> /* adjust some data in the generated instance */)
|> Arb.fromGen
Проблема в том, что когда статический метод SecondCustomType() вызывает Arb.generate, он немедленно вызывает SecondCustomType(), вызывая бесконечную рекурсию. Я понимаю, что Arb.generate должен учитывать пользовательские генераторы, поэтому он вызывает статический SecondCustomType(), но мне нужно вызвать реализацию Arb.generate по умолчанию (не настроенную) для SecondCustomType. Я не могу вызвать реализацию из другого типа, потому что мой пользовательский генератор использует пользовательский генератор для FirstCustomType, поэтому реализация SecondCustomType по умолчанию должна знать обо всех пользовательских генераторах, определенных в типе CustomGenerators. Это своего рода плохой круг, для которого я еще не нашел четкого решения (только обходной путь).
SecondCustomType
в тривиальную оболочку только для теста, скажем,SecondCustomTypeTestWrapper
, определить собственный генератор для этой оболочки, а не для самогоSecondCustomType
, и пусть ваш тест использует оболочку в качестве параметра. - person Fyodor Soikin   schedule 01.04.2016