MySQL データベースを使用する Rails アプリケーションでテストを作成するために RSpec を使用するのは初めてです。フィクスチャを定義し、次のように仕様にロードしています。
before(:all) do
fixtures :student
end
この宣言は、フィクスチャで定義されたデータを学生テーブルに保存しますか?それとも、テストの実行中にテーブルにデータをロードし、すべてのテストの実行後にテーブルからデータを削除するだけですか?
MySQL データベースを使用する Rails アプリケーションでテストを作成するために RSpec を使用するのは初めてです。フィクスチャを定義し、次のように仕様にロードしています。
before(:all) do
fixtures :student
end
この宣言は、フィクスチャで定義されたデータを学生テーブルに保存しますか?それとも、テストの実行中にテーブルにデータをロードし、すべてのテストの実行後にテーブルからデータを削除するだけですか?
まず、 / /でメソッドfixtures
を使用することはできません。これらのフックでフィクスチャを使用しようとしないでください ( など)。:all
:context
:suite hook
post(:my_post)
Infuse が先に書き込みを行うため、describe/context ブロックでのみフィクスチャを準備できます。
電話
fixtures :students, :teachers
DBにデータをロードしないでください!ヘルパーメソッドstudents
とteachers
. 要求されたレコードは、最初にアクセスしようとした瞬間に遅延してロードされます。直前
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 だけが再び挿入されます。
before(:all)
一度ロード/作成されるため、正確なデータが保持されます。あなたはあなたのことをします、そしてテストの終わりにそれは残ります。そのため、bui のリンクafter(:all)
を破棄するかbefore(:each); @var.reload!;end
、以前のテストから最新のデータを取得するために使用する必要があります。ネストされた rspec 記述ブロックでこのアプローチを使用していることがわかります。