При тестировании метода рельсов с помощью Minitest следующее утверждение
Available.all.reload.pluck(:date).tally
возвращает следующий хеш
{Sat, 08 Jun 2024=>2, Tue, 25 Jun 2024=>12, Sun, 07 Jul 2024=>11}
Утверждение, которое предпринимается, заключается в том, чтобы после преобразования данных проверить, что значение ключа даты 2024-07-07
== 11.
Следующее, если предположить, что хеш-ключи являются экземплярами Time
, возвращает false;
существует проблема с вводом даты либо в операторе, либо при его преобразовании в консоль.
new_date = DateTime.new(2024,7,8,0,0,0).to_time
assert Available.all.reload.pluck(:date).tally.include?({new_date=>11})
Как это должно быть написано?
:date
, DateTime
, to_time
– они все у вас есть :) Date
, Time
и DateTime
— это разные классы, последний предназначен для исторических дат. Проверьте классы ваших хеш-ключей (я предполагаю, что это Date
экземпляры) и сравните их с экземпляром этого класса.
...при условии, что хэш-ключи являются экземплярами
Time
Судя по сообщению, это не экземпляры Time
, которые будут представлены через inspect
как «%Y-%m-%d %H:%M:%S.%6N %z», вместо этого они кажутся объектами Date
.
Первое, что я бы порекомендовал, это
Available.all.reload.pluck(:date).tally
Эквивалентно
Available.group(:date).count
Это разгружает подсчет в базу данных и позволяет избежать создания промежуточного Array
Во-вторых, вы можете создать объект Date
, используя Date.new(2024,7,8)
.
Поскольку мы используем Hash
, мы можем просто найти ключ и сравнить значение следующим образом:
Available.group(:date).count[Date.new(2024,7,8)] == 11
При этом, если целью всегда является один Date
и Hash
не требуется, то что-то вроде этого может быть более эффективным:
Available.where(date: Date.new(2024,7,8)).count == 11
полезный способ подойти к вопросу с разных сторон.
new_date = Date.parse("2024-07-07"). утверждать, что хеш имеет соответствующий ключ и значение этого ключа равно 11