7

Railsは、テスト中にactiverecordオブジェクトを保存することによって作成されたデータをどこに保存しますか?

私はその質問に対する答えを知っていると思っていました: 明らかに_test データベースにあります。しかし、これは正しくないようです

このシステムを使用して、rspec テスト中に保存された ActiveRecord データに何が起こっているかをテストしました。

$ rails -d mysql テスト

$ cd テスト

$ nano config/database.yml ...

... mysql データベースを作成する test_test、test_development、test_production

$スクリプト/rspecを生成

$ script/generate rspec_model foo

Foo の移行を編集します。

クラス CreateFoos

$ rake db:migrate

spec/models/foo_spec.rb を編集:

File.expand_path(File.dirname(__FILE__) + '/../spec_helper') が必要です

Foo doを説明する
  before(:each) する
    @valid_attributes = {
      :バー => 12345
    }
  終わり

  「有効な属性を指定して新しいインスタンスを作成する必要があります」
    foo = Foo.new(@valid_attributes)
    foo.save
    「眠っている...」を置く
    スリープ(20)
  終わり
終わり

$レーキスペック

"sleeping..." が表示されたら、mysql セッションが test_test データベースに接続されている別の開いているターミナルに切り替えて、次の操作を行います。

mysql> foos から * を選択します。 空集合 (0.00 秒)

テストの実行中に、mysql セッションで test_test データベースにレコードが表示されないのはなぜですか?

4

3 に答える 3

14

テスト データベース内の項目は、各テストの実行後に既定で消去されるように設計されています。これは、各テストに、その前のテストとの相互作用を引き起こさない独自のサンドボックスがあることを確認するために行われます。

繰り返しますが、これは仕様によるものです。実行順序の保証がないため、同じデータ セットを操作する (または同期実行に依存する) テストは必要ありません。

ただし、 test/test_helper.rb ファイルを次のように変更すると、次のようになります。

self.use_transactional_fixtures = false

それ以外の

self.use_transactional_fixtures = true

これにより、テスト データベースのデータが保持されます。

また、私のアドバイスは、RSpec ではなく、Test::Unit で動作するように特別に設計されています。ただし、あなたが探していると思われる同様の設定が spec_helper.rb にあると思います。

于 2009-01-13T02:19:44.577 に答える
4

「しかし、テストの実行中にmysqlクエリがデータベースにデータを表示しないのはなぜですか?」

取引中だから。トランザクション フィクスチャをオフにすると、テストの実行速度が以前より大幅に遅くなります。

于 2009-01-13T05:51:23.560 に答える
4

次のコマンドを使用して、レコードがテスト データベースに追加されていることを確認できます。

tail -f log/test.log

テストが実行されると、トランザクションが飛んでいくのがわかります。

于 2009-01-13T02:32:48.793 に答える