我正在为我的应用程序编写测试(rspec-rails)。我想检查运行脚本是否没有更改表中的任何对象。 我尝试使用Table.hash或只是添加每个对象哈希,但是当我在对象中进行一些更改时,这些值接缝不会改变。因此在执行此代码后(Someobject只是一个示例 - 普通表):
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
计算所有对象的哈希,运行脚本,计算新哈希并将新哈希与旧哈希进行比较。
它工作正常,但我认为有更好的方法来实现这一目标。问题是 - 如何?我正在使用rails 3.2.13和mongoid。
答案 0 :(得分:1)
MongoDB有一个数据库命令dbhash
- 它通过分片在内部使用,以检查配置数据库集合是否已更改。
使用和输出示例:
> db.runCommand({dbhash:1})
{
"numCollections" : 3,
"host" : "asyasmacbook.local",
"collections" : {
"usertable" : "57fd76283e32631be17d03cd684ab7db"
},
"md5" : "b5cfcfca8dd0e4731676139aff4cf4e7",
"timeMillis" : 274,
"ok" : 1
}
将集合的哈希值与之前的值进行比较,可以确定其中是否有任何更改。