Я новичок в rails (и вообще пишу код) и пишу небольшой проект с использованием RSpec для тестирования. В настоящее время я застрял на модельном тесте, который должен быть довольно простым, и я рву на себе волосы.
У меня есть файл журнала для анализа ошибок. Каждая ошибка имеет имя (например, NoMethodError
) и местоположение (например, "app/controllers/public/profiles_controller.rb:46:in 'index'
). Я успешно проанализировал их из журнала и сейчас пытаюсь записать их в мою базу данных Errors
с помощью ActiveRecord.
Я хочу, чтобы каждая комбинация ошибки / местоположения была записана только один раз. В настоящее время я использую этот блок в моей модели для этого:
#app/models/error.rb
Error.find_or_create_by_name_and_location(@name, @location) do |error|
error.first_seen = (Time.now - 1.day)
error.last_seen = Time.now # These time objects are just filler for now
end
Насколько я могу понять, это должно создать новую запись в моей Errors
базе данных только , если не существует ранее существующей записи с тем же именем и местоположением. Однако это не так.
Я создал образец журнала для выполнения моих тестов, в котором есть две идентичные и одна уникальная пара ошибок / местоположений. Я хочу, чтобы они были записаны как 2 записи в Errors
. Однако, когда я запускаю тест, дубликаты не отфильтровываются, поэтому я получаю 3 записи.
Я написал тест для проверки метода find_or_create_by_name_and_location, и он отлично работает:
#RSpec
#spec/models/error_spec.rb
Error.find_or_create_by_name_and_location( "foo", "bar")
Error.find_or_create_by_name_and_location( "foo", "bar")
Error.should have(1).record
#Test passes
Я перепробовал все, что только мог придумать, но быстро добираюсь никуда, поэтому любая помощь будет очень признательна!