2009-06-02 19 views
7

Tôi hiện đang trong quá trình bắt đầu di chuyển từ đồ đạc đến nhà máy và gặp phải một số thách thức về cơ sở dữ liệu thử nghiệm.Làm cách nào để có cơ sở dữ liệu kiểm tra Rails để xây dựng lại trước mỗi bài kiểm tra?

Khi tôi chạy toàn bộ bộ thử nghiệm của mình, cơ sở dữ liệu được làm sạch và dữ liệu do nhà máy tạo mới được tải lại. Tuy nhiên, khi tôi chạy thử nghiệm đơn vị cá nhân cơ sở dữ liệu không làm sạch các giá trị cũ.

Tôi có thể chạy rake db: test: chuẩn bị trước mỗi bài kiểm tra cá nhân, nhưng điều đó sẽ làm chậm sự phát triển của tôi.

Dưới đây là các thiết lập thử nghiệm của tôi:

self.use_transactional_fixtures = false 
    self.use_instantiated_fixtures = true 

Ví dụ:

require File.dirname(__FILE__) + '/../test_helper' 
class LocationTest < ActiveSupport::TestCase 
    test "should require name to save" do 
    location = Factory.create(:location) 
    end 
end 

sẽ chạy một lần thành công nhưng thất bại về chạy tiếp theo của tập tin thử nghiệm. Điều này không bao giờ xảy ra trước đó bởi vì các đồ đạc thử nghiệm sẽ tải trên mỗi lần chạy.

Tôi đã thêm nhà máy trình tự, nhưng điều đó chuỗi chỉ thuộc tính trong mỗi lần chạy:

Factory.define :location do |l| 
    l.sequence(:name) {|n| "place#{n}"} 
    l.street '123 N Pitt Street' 
    l.state_id 4 
    l.city 'San Francisco' 
    l.location_type_id LocationType::COMMON 
    l.shipper_id 1 
    l.zip 23658 
    end 

kết quả trong:

trunk>ruby test\unit\location_test.rb 
Loaded suite test/unit/location_test 
Started 
. 
Finished in 0.162 seconds. 

1 tests, 0 assertions, 0 failures, 0 errors 

>ruby test\unit\location_test.rb 
Loaded suite test/unit/location_test 
Started 
E 
Finished in 0.134 seconds. 

    1) Error: 
test_should_require_name_to_save(LocationTest): 
ActiveRecord::RecordInvalid: Validation failed: Name has already been taken 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/proxy/create.rb:5:in `result' 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/factory.rb:293:in `run' 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/factory.rb:237:in `create' 
    test/unit/location_test.rb:18:in `test_should_require_name_to_save' 

1 tests, 0 assertions, 0 failures, 1 errors 

Trả lời

1

Trước tiên hãy kiểm tra cài đặt thử nghiệm của bạn để chắc chắn rằng chúng là thứ bạn muốn, mặc dù tôi nghi ngờ bạn có thể không cho phép thực hành tiêu chuẩn chạy thử nghiệm trong giao dịch (được cuộn lại khi thoát).

Các tùy chọn khác là (1) Sử dụng thủ công các giao dịch cho các thử nghiệm như trên (nơi chưa có giao dịch), cộng (2) Thêm phương pháp teardown để xóa các bảng có liên quan theo cách thủ công.

+1

Thêm: self.use_transactional_fixtures = true vào lớp này và hoạt động! Cảm ơn bạn. Có, có những lý do tại sao tôi không thể thay đổi nó cho toàn bộ môi trường. Tôi thậm chí không nghĩ thay đổi nó chỉ cho một thử nghiệm này ... doh! Cảm ơn bạn lần nữa. –

0

Bạn có thể ghi đè lên các phương pháp setup trong thử nghiệm đơn vị của bạn để nó xóa dữ liệu bạn muốn xóa.

0

Vì mỗi thử nghiệm nên bắt đầu từ một cơ sở dữ liệu sạch, cố gắng để có được những điều trong codebase của bạn đến điểm mà bạn có thể giao dịch sử dụng cho mỗi bài kiểm tra. Chất lượng thử nghiệm của bạn sẽ được cải thiện nhiều.

Ngoài ra, điều này không liên quan trực tiếp đến câu hỏi của bạn ... nhưng không bao giờ sử dụng đồ đạc Rails, trong mọi trường hợp, cho bất cứ điều gì. Sử dụng các nhà máy thay thế (hãy kiểm tra gem factory_girl_rails). Ngoài ra, hãy kiểm tra RSpec thay vì Test :: Unit.

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