Утверждение Minitest не выполняется при проверке

Всякий раз, когда я пытаюсь установить два объекта assert_equal, я всегда получаю такие ошибки:

   No visible difference in the User#inspect output.
   You should look at the implementation of #== on User or its members.

Это произошло и с Time и Array. Документы Minitest также мало что говорят об этом.

Я использую Ruby 2.0.0, но я использовал 2.2.0, и произошло то же самое. Также используется последний минитест.

Кроме того, я использую Ubuntu 14.10.


person Fabian Silva    schedule 24.02.2015    source источник
comment
Действительно ли это происходит для всех объектов, пробовали ли вы сравнивать действительно простые вещи, такие как целые числа? Можете ли вы привести несколько примеров?   -  person Jesper    schedule 24.02.2015
comment
Вы используете собственный difftool?   -  person Jesper    schedule 24.02.2015
comment
На самом деле это просто происходит для Time, Array и пользовательских объектов, которые я создал, таких как класс User. Я не использую никаких пользовательских инструментов. Пример: result = @service.run result.must_equal(@users.get_single(1)) Примечание. Я также пробовал assert_equal, и происходит то же самое.   -  person Fabian Silva    schedule 24.02.2015


Ответы (4)


О сообщении

Это сообщение, которое не является ошибкой, отображается, когда утверждение не выполняется, но MiniTest не может найти разницу между объектами.

Проверьте этот метод.

diff запускает #inspect для двух объектов и запускает для них инструмент сравнения. Если различий нет, отображается это сообщение.

В принципе, вы бы хотели, чтобы два объекта, которые не равны, имели разные выходные данные при проверке. Однако это не высечено на камне, и некоторые классы в стандартных библиотеках ruby ​​не соответствуют этому свойству, например Time. Когда дело доходит до ваших собственных классов, возможно, вы написали собственный метод #inspect?

Что касается Time, проверка показывает только секунды, а не дроби, но равенство рассматривает дроби, поэтому два объекта времени могут не быть равными, но все же выглядеть одинаково при проверке.

Что касается Array, если включенные в него объекты могут не совпадать, но выглядеть одинаково при проверке, это приведет к отображению сообщения.

Если вы получаете это сообщение, несмотря на то, что выходные данные проверки отличаются, значит, что-то не так с инструментом сравнения. MiniTest пытается сделать некоторые обоснованные предположения о том, какой инструмент сравнения использовать. Вы можете проверить выбранный инструмент сравнения, напечатав MiniTest::Assertions.diff.

О равенстве объектов

Если реальная проблема заключается в том, что ваши объекты не равны, когда вы ожидаете, что они будут равны, вы должны посмотреть, как метод == определен в соответствующих классах. Реализация по умолчанию просматривает идентификаторы объектов, присвоенные каждому объекту при создании экземпляра, что, вероятно, не то, что вам нужно, если, например, вы имеете дело с объектами, которые представляют строки базы данных.

person Jesper    schedule 24.02.2015
comment
Я не создавал собственные методы #inspect ни для одного объекта, и странно то, что я только что протестировал все в другой среде (OS X Yosemite), и все работает нормально. - person Fabian Silva; 24.02.2015
comment
Какой была исходная система? - person Jesper; 24.02.2015
comment
Ubuntu 14.10 (это в конце моего вопроса), и я использовал как Ruby 2.2, так и 2.0. - person Fabian Silva; 24.02.2015
comment
Мне жаль, что я этого не заметил. Вы проверили вывод MiniTest::Assertions.diff? - person Jesper; 24.02.2015
comment
На каких системах? Утверждения ведут себя одинаково на Ubuntu и OS X? Отличается только сообщение? - person Jesper; 24.02.2015
comment
Что ж, OS X не показывает никаких сообщений об ошибках, все тесты выполняются нормально. Обе системы также показывают diff -u - person Fabian Silva; 24.02.2015
comment
Я в тупике. Удачи в этом. - person Jesper; 24.02.2015

Возможно, экземпляры кодирования двух объектов различаются. Используйте encoding и force_encoding для проверки:

puts obj1.encoding
puts obj2.encoding

Вот пример вывода:

ISO-8859-1
ASCII-8BIT

В этом случае экземпляр кодировки obj1 — ISO-8859-1, а экземпляр кодировки obj2 — ASCII-8BIT. Затем, чтобы преобразовать экземпляр кодировки obj1 в ASCII-8BIT с force_encoding:

assert_equal(obj1.force_encoding(Encoding::ASCII_8BIT), obj2)

Для получения более подробной информации посетите https://ruby-doc.org/core-2.2.0/Encoding.html

person Protocol    schedule 06.12.2016

У меня была следующая ошибка:

No visible difference in the String#inspect output.

и попробовал ответ @Protocol - я получил это:

NoMethodError: undefined method `encoding' for "5930128297ebef21e1c7fd50":BSON::ObjectId

Я использую Mongoid, поэтому, по крайней мере, для этой проблемы решение состояло в том, чтобы вызвать to_s для объекта BSON, и мое равенство строк было тем, что я ожидал.

person dax    schedule 01.06.2017

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

Ex:

assert_equal object_one.to_s, object_two.to_s
person Ricardo Green    schedule 26.01.2021