Виправлення обрізаного виведення в повідомленнях про помилки RSpec

pic

Під час роботи з великими хешами або масивами в RSpec часто можна зіткнутися з проблемою обрізаного виведення, яке ускладнює налагодження. Це може стати серйозною проблемою, коли потрібно детально проаналізувати різницю між великими структурами даних, що містять багато елементів. Але є просте рішення цієї проблеми.

Розглянемо приклад тесту, де є два схожі, але різні хеші:

truncated_spec.rb

RSpec.describe "Порівняння хешів" do
it "порівнює два великі хеші" do
expected = {
user: {
name: "John Smith",
email: "[email protected]",
address: {
street: "123 Main St",
city: "Boston",
state: "MA",
zip: "02108"
},
preferences: {
theme: "dark",
notifications: true,
privacy: "high",
language: "English"
},
history: [
{ action: "login", timestamp: "2023-04-10T10:00:00Z" },
{ action: "update_profile", timestamp: "2023-04-10T10:15:00Z" },
{ action: "logout", timestamp: "2023-04-10T11:30:00Z" }
]
}
}

actual = {
user: {
name: "John Smith",
email: "[email protected]",
address: {
street: "123 Main St",
city: "Boston",
state: "MA",
zip: "02109" # Це відрізняється!
},
preferences: {
theme: "dark",
notifications: true,
privacy: "high",
language: "English"
},
history: [
{ action: "login", timestamp: "2023-04-10T10:00:00Z" },
{ action: "update_profile", timestamp: "2023-04-10T10:15:00Z" },
{ action: "logout", timestamp: "2023-04-10T11:30:00Z" }
]
}
}

expect(actual).to eq(expected)
end
end

Коли ви запустите цей тест за допомогою команди rspec truncated_spec.rb, виведення буде таким:

F

Неуспішні тести:

1) Порівняння хешів порівнює два великі хеші
Failure/Error: expect(actual).to eq(expected)

expected: {:user=>{:name=>"John Smith", :email=>"[email protected]", :address=>{:street=>"123 Main St", :city=>"Boston", :state=>"MA", :zip=>"02108"}, :preferences=>{:theme=>"dark", :notifications=>true, :privacy=>"high", ...}, :history=>[{:action=>"login", :timestamp=>"2023-04-10T10:00:00Z"}, {:action=>"updateprofile", ...}, ...]}}
got: {:user=>{:name=>"John Smith", :email=>"[email protected]", :address=>{:street=>"123 Main St", :city=>"Boston", :state=>"MA", :zip=>"02109"}, :preferences=>{:theme=>"dark", :notifications=>true, :privacy=>"high", ...}, :history=>[{:action=>"login", :timestamp=>"2023-04-10T10:00:00Z"}, {:action=>"update
profile", ...}, ...]}}

(порівняно за допомогою ==)
# ./truncated_spec.rb:36:in `block (2 рівень) в '

Тест завершено за 0.02838 секунд (файли завантажено за 0.09778 секунд)
1 приклад, 1 помилка

У виведенні видно, що частини хешів замінюються на ..., що ускладнює виявлення різниці в поштовому індексі.

Щоб вирішити цю проблему, треба додати одну просту стрічку до файлу spec_helper.rb або на початок тестового файлу:

RSpec::Support::ObjectFormatter.defaultinstance.maxformattedoutputlength = 10000

Після цього оновимо тестовий файл, додавши цей рядок:

truncated_spec.rb

require 'rspec'

Додайте цей рядок, щоб збільшити довжину виведення

RSpec::Support::ObjectFormatter.defaultinstance.maxformattedoutputlength = 10000

RSpec.describe "Порівняння хешів" do
# Той самий тест, що і раніше
end

Тепер, якщо ви запустите тест ще раз за допомогою rspec truncated_spec.rb, виведення буде виглядати так:

F

Неуспішні тести:

1) Порівняння хешів порівнює два великі хеші
Failure/Error: expect(actual).to eq(expected)

expected: {:user=>{:name=>"John Smith", :email=>"[email protected]", :address=>{:street=>"123 Main St", :city=>"Boston", :state=>"MA", :zip=>"02108"}, :preferences=>{:theme=>"dark", :notifications=>true, :privacy=>"high", :language=>"English"}, :history=>[{:action=>"login", :timestamp=>"2023-04-10T10:00:00Z"}, {:action=>"updateprofile", :timestamp=>"2023-04-10T10:15:00Z"}, {:action=>"logout", :timestamp=>"2023-04-10T11:30:00Z"}]}}
got: {:user=>{:name=>"John Smith", :email=>"[email protected]", :address=>{:street=>"123 Main St", :city=>"Boston", :state=>"MA", :zip=>"02109"}, :preferences=>{:theme=>"dark", :notifications=>true, :privacy=>"high", :language=>"English"}, :history=>[{:action=>"login", :timestamp=>"2023-04-10T10:00:00Z"}, {:action=>"update
profile", :timestamp=>"2023-04-10T10:15:00Z"}, {:action=>"logout", :timestamp=>"2023-04-10T11:30:00Z"}]}}

(порівняно за допомогою ==)
# ./truncated_spec.rb:39:in `block (2 рівень) в '

Тест завершено за 0.03022 секунд (файли завантажено за 0.0995 секунд)
1 приклад, 1 помилка

Тепер ми чітко бачимо, що поштовий індекс у expected — "02108", а в actual — "02109".

Це рішення є дуже корисним, коли ви працюєте з великими структурами даних, які часто обрізаються в повідомленнях про помилки.

Francium Tech є технологічною компанією, яка зосереджена на доставці програмного забезпечення найвищої якості в масштабах і з неймовірною швидкістю. Числа і розміри даних нас не лякають. Якщо у вас є будь-які вимоги або ви хочете отримати безкоштовну перевірку здоров'я ваших систем або архітектури, не соромтеся надіслати електронного листа на [email protected]; ми зв'яжемося з вами!

Перекладено з: Fixing Truncated Output in RSpec Error Messages