Під час роботи з великими хешами або масивами в 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=>"updateprofile", ...}, ...]}}
(порівняно за допомогою ==)
# ./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=>"updateprofile", :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