2015-02-24 3 views
5

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

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

Это случилось со временем и массивом, а также. Minitest docs на самом деле не говорят об этом.

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

Кроме того, я запускаю Ubuntu 14.10.

+0

Действительно ли это происходит для * всех * объектов, вы пытались сравнить действительно основные вещи, такие как целые числа? Можете ли вы привести несколько примеров? – Jesper

+0

Вы используете пользовательский diffftool? – Jesper

+0

На самом деле это происходит только для времени, массива и пользовательских объектов, которые я создал, например, класса User. Я не использую никаких специальных инструментов. Пример: 'result = @ service.run' ' result.must_equal (@ users.get_single (1)) ' Примечание: Я также попробовал assert_equal, и то же самое происходит –

ответ

7

О сообщении

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

Check out this method.

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

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

Относительно Time, проверяйте только секунды, а не доли, но равенство смотрит на фракции, поэтому два объекта времени могут быть не равными, но при осмотре все равно выглядят одинаково.

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

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

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

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

+0

Я не создал пользовательский #inspect методы на любом объекте, и странно, что я просто тестировал все в другой среде (OS X Yosemite), и все работает нормально –

+0

Какова была исходная система? – Jesper

+0

Ubuntu 14.10 (Это в самом низу моего вопроса), и я использовал оба Ruby 2.2 и 2.0 –

1

Возможно, экземпляры кодировки 2 объектов различны. Используйте 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

0

Я имел следующую ошибку:

No visible difference in the String#inspect output. 

и попытался @ ответ протокола - я получил это:

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

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

Смежные вопросы