0

アプリケーションのテスト (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 == hash1bhash2a == 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 を使用しています。

4

1 に答える 1

1

MongoDB にはデータベース コマンドがあります。これは、構成dbhashデータベース コレクションが変更されたかどうかを確認するためにシャーディングによって内部的に使用されます。

使用例と出力:

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

コレクションのハッシュを以前の値と比較すると、変更があったかどうかを判断できます。

于 2013-09-04T03:34:14.660 に答える