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
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. –