2012-07-27 37 views
23

Tôi mới sử dụng RSpec để viết các bài kiểm tra trong một ứng dụng Rails sử dụng cơ sở dữ liệu MySQL. Tôi đã xác định đồ đạc của tôi và tải chúng trong spec của tôi như sau:Đồ đạc trong RSpec

before(:all) do 
    fixtures :student 
end 

Liệu tuyên bố này lưu dữ liệu quy định tại đồ đạc của tôi trong bảng sinh viên hay nó chỉ tải các dữ liệu trong bảng trong khi các bài kiểm tra là chạy và loại bỏ nó khỏi bảng sau khi tất cả các thử nghiệm được chạy?

+10

Thay vì đồ đạc, hãy thử [factory_girl] (http://www.fabricationgem.org/) hoặc [fabrication] (http://www.fabricationgem.org/). –

Trả lời

-1

Tùy thuộc vào cách bạn định cấu hình RSpec. Xem here để biết thêm chi tiết

1

before(:all) giữ nguyên dữ liệu chính xác, vì dữ liệu được tải/tạo một lần. Bạn làm điều của bạn, và vào cuối của thử nghiệm nó vẫn còn. Đó là lý do tại sao liên kết của bui có after(:all) để hủy hoặc sử dụng before(:each); @var.reload!;end để nhận dữ liệu mới nhất từ ​​các thử nghiệm trước đây. Tôi có thể thấy bằng cách sử dụng phương pháp này trong lồng nhau rspec mô tả các khối.

16

Nếu bạn muốn sử dụng đồ đạc với RSpec, chỉ rõ đồ đạc của bạn trong khối mô tả, không phải trong vòng một trước khi khối:

describe StudentsController do 
    fixtures :students 

    before do 
    # more test setup 
    end 
end 

đồ đạc sinh viên của bạn sẽ được nạp vào bảng sinh viên và sau đó cuộn lại tại kết thúc mỗi bài kiểm tra bằng cách sử dụng các giao dịch cơ sở dữ liệu.

+1

https://www.relishapp.com/rspec/rspec-rails/docs/model-specs/transactional-examples#run-in-transactions-with-fixture – nruth

3

Trước hết: Bạn không thể sử dụng phương pháp fixtures trong :all/:context/:suite hook. Đừng cố gắng sử dụng đồ đạc trong các móc này (như post(:my_post)).

Bạn có thể chuẩn bị đồ đạc chỉ trong mô tả/bối cảnh như Infuse viết trước đó.

Gọi

fixtures :students, :teachers 

không tải bất kỳ dữ liệu vào DB! Chỉ cần chuẩn bị các phương pháp trợ giúp studentsteachers. Các hồ sơ được yêu cầu được nạp lazily trong thời điểm này khi bạn lần đầu tiên thử truy cập chúng. Ngay trước

dan=students(:dan) 

Điều này sẽ tải sinh viên và giáo viên theo cách delete all from table + insert fixtures.

Vì vậy, nếu bạn chuẩn bị một số học sinh trong móc trước (: ngữ cảnh), chúng sẽ biến mất ngay bây giờ !!

Chèn bản ghi được thực hiện chỉ một lần trong bộ thử nghiệm.

Bản ghi từ đồ đạc sẽ không bị xóa ở cuối bộ kiểm tra. Chúng được xóa và chèn lại vào lần chạy bộ thử nghiệm tiếp theo.

dụ:

#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 loade 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 

Tất cả sự mong đợi trong các thử nghiệm trên sẽ vượt qua

Nếu những thử nghiệm đang chạy lại (trong bộ tới) và theo thứ tự này, so với kỳ vọng

expect(Student.count).to eq 1 

sẽ KHÔNG được đáp ứng! Sẽ có 3 học viên (: dan,: paul và new @james). Tất cả chúng sẽ bị xóa trước students(:dan) và chỉ: paul và: dan sẽ được chèn lại.

+1

Vâng! Tôi tìm thấy thủ thuật để làm cho tất cả các đồ đạc được nạp trước khi kiểm tra tất cả. Chỉ cần thêm RSpec.configure {| config | config.global_fixtures =: all} và kiểm tra trực tiếp trong spec_helper, nó sẽ cố gắng truy cập bất kỳ vật cố định nào. Bằng cách này tất cả các đồ đạc được nạp trước. – Foton

Các vấn đề liên quan