У меня есть код, который доставляет вещи на основе взвешенного случайного числа. Вещи с большим весом, скорее всего, будут выбраны случайным образом. Теперь, будучи хорошим рубистом, я, наверное, хочу покрыть весь этот код тестами. И я хочу проверить, что все происходит в соответствии с правильными вероятностями.
Итак, как мне это проверить? Создание тестов для чего-то, что должно быть случайным, очень затрудняет сравнение фактического и ожидаемого. Несколько идей, которые у меня есть, и почему они не работают хорошо:
Stub Kernel. И в моих тестах возвращать фиксированные значения. Это круто, но rand () вызывается несколько раз, и я не уверен, что смогу оснастить это достаточным контролем, чтобы проверить, что мне нужно.
Получите случайный элемент ОГРОМНОЕ количество раз и сравните фактическое соотношение с ожидаемым соотношением. Но если я не смогу запускать его бесконечное количество раз, он никогда не будет идеальным и может периодически выходить из строя, если мне не повезет с ГСЧ.
Используйте постоянное случайное начальное число. Это делает ГСЧ повторяемым, но по-прежнему не дает мне никакой проверки, что элемент А будет выполняться в 80% случаев (например).
Итак, какой подход я могу использовать для написания тестового покрытия для случайных вероятностей?