Генерация уникальных строк в FsCheck

Мне нужно генерировать уникальныеnull строки для использования в качестве Dictionary ключи. Я попробовал что-то вроде:

 public static Gen<NonNull<string>> UniqueStrings()
 {
     return from s in Arb.Default.NonNull<string>().Generator
            select s;
 }

Тогда я использую UniqueString() в:

public static Arb<Foo> Foos()
{
    // Foo's constructor will use the string parameter
    // as key to an internal Dictionary
    return (from nonNullString in UniqueStrings()
            select new Foo(nonNullString.Item)).ToArbitrary();
}

Тем не менее, я получаю исключение в тестировании свойств Foo потому что FsCheck иногда генерирует одну и ту же строку дважды, что приводит к DuplicateKeyException,

Как я могу генерировать уникальные строки для передачи в конструктор Foo?

3 ответа

Решение

Вы не можете заставить генератор FsCheck генерировать уникальные значения, потому что у вас практически нет доступа к истории ранее сгенерированных значений, и сам FsCheck не гарантирует уникальность.

В этом случае вы можете сгенерировать, скажем, список строк, а затем выполнить уникальный список, используя Distinct() например. Затем вы можете также сгенерировать список Foo, используя аналогичный подход.

Например:

Gen<Foo[]> res = from s in Arb.Default.Set<string>().Generator
                 select s.Select(ss => new Foo(ss)).ToArray();

(Обратите внимание, что вы не можете использовать, чтобы получить ss потому что C# не позволяет вам смешивать разные методы LINQ, один включен Genодин включен IEnumerable)

Предложение, мне интересно, если это не дополнительная собственность, которую вы хотите проверить. Если пользователь Foo должен дать ему уникальную строку, как это поддерживается? Что будет, если они этого не сделают?

Для генерации уникальных строк вы можете использовать генератор Guid, это стандартный способ генерации уникальных строк даже на нескольких компьютерах.

Вместо генерации уникальных строк вы можете добавить простую проверку перед вставкой в ​​словарь.

Обновление: хорошо. Делайте перетасовку вашей строки после поколения. Вы можете прочитать здесь
речь идет о массиве Integer, но вы можете легко настроить его для строки

Другие вопросы по тегам