35

MySQL データベースを使用する Rails アプリケーションでテストを作成するために RSpec を使用するのは初めてです。フィクスチャを定義し、次のように仕様にロードしています。

before(:all) do
  fixtures :student
end

この宣言は、フィクスチャで定義されたデータを学生テーブルに保存しますか?それとも、テストの実行中にテーブルにデータをロードし、すべてのテストの実行後にテーブルからデータを削除するだけですか?

4

3 に答える 3

9

まず、 / /でメソッドfixturesを使用することはできません。これらのフックでフィクスチャを使用しようとしないでください ( など)。:all:context:suite hookpost(:my_post)

Infuse が先に書き込みを行うため、describe/context ブロックでのみフィクスチャを準備できます。

電話

fixtures :students, :teachers

DBにデータをロードしないでください!ヘルパーメソッドstudentsteachers. 要求されたレコードは、最初にアクセスしようとした瞬間に遅延してロードされます。直前

dan=students(:dan) 

これにより、生徒と教師がdelete all from table + insert fixtures邪魔になります。

そのため、before(:context) フックで何人かの学生を準備すると、それらはなくなります!!

レコードの挿入は、テスト スイートで 1 回だけ行われます。

フィクスチャからのレコードは、テスト スイートの最後に削除されません。それらは削除され、次回のテスト スイートの実行時に再挿入されます。

例:

 #students.yml
   dan:
     name: Dan 
   paul:
     name: Paul

 #teachers.yml
    snape:
      name: Severus




describe Student do
  fixtures :students, :teachers
  
  before(:context) do
    @james=Student.create!(name: "James")
  end

  it "have name" do
   expect(Student.find(@james.id)).to be_present
   expect(Student.count).to eq 1
   expect(Teacher.count).to eq 0
  
   students(:dan)
   
   expect(Student.find_by_name(@james.name)).to be_blank
   expect(Student.count).to eq 2
   expect(Teacher.count).to eq 1
   
  end
end


#but when fixtures are in DB (after first call), all works as expected (by me)

describe Teacher do
  fixtures :teachers # was loaded in previous tests
  
  before(:context) do
    @james=Student.create!(name: "James")
    @thomas=Teacher.create!(name: "Thomas")
  end

  it "have name" do
   expect(Teacher.find(@thomas.id)).to be_present
   expect(Student.count).to eq 3 # :dan, :paul, @james
   expect(Teacher.count).to eq 2 # :snape, @thomas
  
   students(:dan)
      
   expect(Teacher.find_by_name(@thomas.name)).to be_present
   expect(Student.count).to eq 3
   expect(Teacher.count).to eq 2
   
  end
end

上記のテストのすべての期待に合格します

これらのテストが(次のスイートで)この順序で再度実行されると、予想よりも

 expect(Student.count).to eq 1

満たされません!生徒は 3 人 (:dan、:paul、そして新しい @james) です。それらはすべて削除されstudents(:dan)、:paul と :dan だけが再び挿入されます。

于 2016-09-29T13:28:50.257 に答える
1

before(:all)一度ロード/作成されるため、正確なデータが保持されます。あなたはあなたのことをします、そしてテストの終わりにそれは残ります。そのため、bui のリンクafter(:all)を破棄するかbefore(:each); @var.reload!;end、以前のテストから最新のデータを取得するために使用する必要があります。ネストされた rspec 記述ブロックでこのアプローチを使用していることがわかります。

于 2012-12-22T12:10:44.970 に答える