Я пишу тесты (rspec-rails) для моего приложения. Я хотел бы проверить, не работает ли скрипт в каком-либо объекте в таблице. Я пробовал использовать Table.hash или просто добавлял хэш каждого объекта, но эти значения не изменялись, когда я делаю некоторые изменения в объектах. Таким образом, после выполнения этого кода (SomeObject это просто пример - обычный стол):Rspec, как проверить, не изменилась ли таблица
hash1a = Someobject.hash
o = Someobject.first
hash2a = o.hash
o.field = o.field + 1
o.save!
hash1b = Someobject.hash
hash2b = o.hash
hash1a == hash1b
и hash2a == hash2b
. Поэтому, очевидно, я не могу использовать любой из этих методов, чтобы проверить, изменился ли какой-либо объект.
В настоящее время я использую этот код:
def run_script #run script and btw check whether it throws exception
lambda { eval File.read(File.join(Rails.root, 'lib', 'tasks', 'some_script.rb')) }.should_not raise_error()
end
def objects_hash #calculates hash of each order json version and than concatenates all strings and return it
hash = ''
Someobject.each do |object|
hash+= Digest::SHA1.base64digest object.as_json.to_s
end
hash
end
....
expect {run_script}.to_not change{objects_hash} #expect run_script to not change any object
В основном он преобразует каждый объект в JSON, а затем в строку, а затем вычисляет хэш этой строки. Все строки (хеши) объединены в , и это значение возвращается. Итак, эта строка expect {run_script}.to_not change{objects_hash} #expect run_script to not change any object
вычисляет хэш всех объектов, запускает скрипт, вычисляет новый хеш и сравнивает новый хэш со старым.
Он работает нормально, но я думаю, что есть лучший способ достичь этого. Вопрос в том, как? Я использую рельсы 3.2.13 и мангоид.
Похоже на разумное решение, если какой-либо документ был изменен в коллекции, если вы не хотите проверять файлы журнала и т. Д. – WiredPrairie
Мне не нужно проверять файлы журналов и т. Д. (Только все объекты одной таблицы) но я просто ищу лучшее решение в описанной ситуации. – cyriel
Я говорю, что вы можете использовать файлы журналов для поиска изменений. Но, как я уже сказал, я не вижу причин не делать то, что вы предлагаете. Это не будет очень быстро, но для случая использования у вас есть, это не похоже, что это должно быть проблемой. – WiredPrairie