2013-09-02 2 views
0

Я пишу тесты (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 и мангоид.

+0

Похоже на разумное решение, если какой-либо документ был изменен в коллекции, если вы не хотите проверять файлы журнала и т. Д. – WiredPrairie

+0

Мне не нужно проверять файлы журналов и т. Д. (Только все объекты одной таблицы) но я просто ищу лучшее решение в описанной ситуации. – cyriel

+0

Я говорю, что вы можете использовать файлы журналов для поиска изменений. Но, как я уже сказал, я не вижу причин не делать то, что вы предлагаете. Это не будет очень быстро, но для случая использования у вас есть, это не похоже, что это должно быть проблемой. – WiredPrairie

ответ

1

У MongoDB есть команда базы данных dbhash - она ​​используется внутренне с помощью sharding, чтобы проверить, изменились ли коллекции базы данных конфигурации.

Пример использования и вывода:

> db.runCommand({dbhash:1}) 
{ 
    "numCollections" : 3, 
    "host" : "asyasmacbook.local", 
    "collections" : { 
     "usertable" : "57fd76283e32631be17d03cd684ab7db" 
    }, 
    "md5" : "b5cfcfca8dd0e4731676139aff4cf4e7", 
    "timeMillis" : 274, 
    "ok" : 1 
} 

Сравнение хеш-коллекции, к предыдущему значению позволяет вам определить, были ли какие-либо изменения в нем.

+0

Точнее - я использовал этот код: 'ожидать {run_script} .to_not change {Mongoid :: Sessions.default.command (dbHash: 1) ['collections'] ['tablename']}'. Конечно, это решение работает только с Mongoid, но для меня выглядит лучше, чем решение, которое я представил в вопросе. – cyriel

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