2009-07-27 31 views
20

Gần đây tôi đã chuyển từ đồ đạc sang factory_girl để kiểm tra ứng dụng Ruby on Rails của tôi. Nếu tôi chạy thử nghiệm rake: các đơn vị, để chạy các kiểm tra trong thư mục/đơn vị của tôi, tất cả chúng đều chạy hoàn hảo. Điều này cũng đúng nếu tôi chạy thử nghiệm chức năng của mình (trong thư mục chức năng/của tôi) với kiểm tra rake: functionals.Xóa cơ sở dữ liệu thử nghiệm giữa đơn vị và kiểm tra chức năng trong Rails (factory_girl)

Tuy nhiên, nếu tôi chỉ chạy thử nghiệm cào, để chạy cả kiểm tra đơn vị và chức năng cùng nhau, xác thực của tôi không thành công trong nhóm thử nghiệm thứ hai (chức năng, trong trường hợp này), với thông báo "Xác thực không thành công: Tên đã đã được thực hiện. "

Tôi tin rằng điều này là do các thử nghiệm chức năng tạo các đối tượng với các tham số giống như các đối tượng đã được tạo trong các bài kiểm tra đơn vị - dẫn tôi tin rằng cơ sở dữ liệu thử nghiệm không bị xóa giữa đơn vị và các bài kiểm tra chức năng .

Tôi sử dụng trình tự của factory_girl để có các thuộc tính duy nhất cho các đối tượng, có nghĩa là factory_girl đang được đặt lại giữa các thử nghiệm, trong khi cơ sở dữ liệu thì không. Tôi có thể làm gì để giải quyết vấn đề này? Có cách nào để xóa cơ sở dữ liệu giữa hai gói thử nghiệm của tôi không?

+1

bạn có tìm thấy giải pháp nào cho vấn đề này không? Tôi có chính xác như vậy. Đối với một số lý do nhà máy cô gái trình tự được thiết lập lại giữa các bài kiểm tra chức năng và đơn vị. – sandstrom

Trả lời

11

Cố gắng viết này trong thư mục test/test_helper.rb

eval IO.read(File.expand_path(File.dirname(__FILE__) + "/../Rakefile")) 
class Test::Unit::TestCase 
.... 
#db:test:prepare won't work, don't know why, 
#as DROP DATABASE won't execute (me on PostgreSQL). 
#even if I write, 
#ActiveRecord::Base.connection.disconnect! 
Rake::Task["db:reset"].invoke 
end 

Đó là không một giải pháp khuyến khích. Làm cho các bài kiểm tra chậm hơn, nhưng hoạt động.

+0

Hoàn hảo, cảm ơn! Tôi không có quá nhiều bài kiểm tra vào thời điểm này, vì vậy tốc độ không phải là một vấn đề lớn. – NolanDC

+0

Điều này cũng phù hợp với tôi! Có ai biết tại sao điều này xảy ra? Tôi đã sử dụng các nhà máy trong một thời gian và điều này chưa bao giờ là vấn đề. Dường như việc cập nhật từ nhà máy-cô gái đến nhà máy-cô gái-ray là nguyên nhân của vấn đề ... Tôi đang sử dụng đường ray 3.2.2 –

4

Plugin đường ray có tên "override_rake_task" có thể được sử dụng để ghi đè tác vụ Rake "test" được xác định bên trong nếu đá quý Rails. Đây là một nhiệm vụ rất đơn giản thực hiện 3 nhiệm vụ khác cái khác: kiểm tra: đơn vị, kiểm tra: hàmkiểm tra: tích hợp. Bạn có thể bao gồm việc thực thi tác vụ "db: test: purge" để xóa DB kiểm tra trước khi thực hiện kiểm tra: các hàm.

Dường như nếu bạn không sử dụng plugin này và nếu bạn xác định tác vụ trong ứng dụng đường ray có cùng tên, thì cào sẽ thực hiện cả hai tác vụ: mặc định và của bạn.

+0

Có cách nào để thực hiện thử nghiệm db: test: purge giữa đơn vị và kiểm tra chức năng mà không ghi đè tác vụ rake mặc định không? – NolanDC

+0

Có, bạn có thể làm điều tương tự mà không cần plugin bằng cách trước tiên xóa nhiệm vụ mặc định và thêm một tệp mới có cùng mã + "db: test: purge": "remove_task: test" rồi "task: test do .. . kết thúc". Tôi thấy điều này ở đây: http://www.taknado.com/2007/7/30/overriding-rake-tasks/ –

2

Các giải pháp trên không hiệu quả đối với tôi. Nếu bạn đang cố gắng tiếp cận với một cơ sở dữ liệu bên ngoài chạy thử nghiệm đơn vị có thể cung cấp cho một số lỗi lạ. Đối với một số lý do họ không được xóa sau khi chạy thử nghiệm, do đó bạn phải chạy rake db:test:purge sau khi chạy thử nghiệm đơn vị. Đặt cái này vào Rakefile của bạn và nó sẽ sửa chữa nó.

Rake::Task["db:test:prepare"].enhance do 
    Rake::Task["db:test:purge"].invoke 
end 
1

Tôi gặp sự cố này trên máy của mình. Tôi đã nhận được thất bại kiểm tra, từ các vấn đề xác nhận vì cơ sở dữ liệu không được thiết lập lại đúng cách giữa các thử nghiệm. Một số câu chuyện về tình huống của tôi:

 
-I had a linux box, and was running code, that I knew should pass the tests. 
-I bought a Mac with Lion installed and attempted to get my code running on that machine. 
-I installed mysql from source 

Mọi thứ được cài đặt tốt. Cơ sở dữ liệu của tôi làm việc và đường ray có thể truy cập nó. Khi tôi chạy thử nghiệm tuy nhiên, tôi chạy vào cùng một vấn đề. Tôi đã xem qua bài này, và đã thử cả hai giải pháp được đề xuất (mặc dù nó không có vẻ giống như một vấn đề mã, nó có vẻ như một vấn đề cấu hình kể từ khi rake chạy tốt trên hộp linux của tôi). Không có giải pháp nào hoạt động.

Tôi đã gỡ bỏ mysql:

 
sudo rm /usr/local/mysql 
sudo rm -rf /usr/local/mysql* 
sudo rm -rf /Library/StartupItems/MySQLCOM 
sudo rm -rf /Library/PreferencePanes/My* 
sudo rm -rf /Library/Receipts/mysql* 
sudo rm -rf /Library/Receipts/MySQL* 
sudo rm /etc/my.cnf 
sudo rm /usr/local/bin/mysql* 

tôi cài đặt lại mysql với homebrew thay vì bằng tay làm việc đó từ nguồn (bước này là lịch sự của lời khuyên một đồng nghiệp của):

 
export PATH="/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH" 
brew install https://github.com/adamv/homebrew-alt/raw/master/versions/mysql51.rb 
unset TMPDIR 
mysql_install_db 

sau đó tôi lại -ke rake, và tất cả các bài kiểm tra đã trôi qua. Nếu bất cứ ai ở trên Lion, xây dựng mysql từ nguồn, và chạy vào vấn đề này, đây có thể là một giải pháp.

12

Một giải pháp dòng lệnh để xóa (tái tạo lại) cơ sở dữ liệu kiểm tra:

rake db:test:prepare 
0

DB sạch hơn là một viên ngọc khá đẹp đặc biệt để làm sạch giữa các xét nghiệm. Nó cung cấp một vài tùy chọn bao gồm gói mọi thử nghiệm trong một giao dịch và lùi lại, cắt bớt bảng và xóa.

Nó cũng hỗ trợ nhiều ORMS trong trường hợp bạn không sử dụng/sử dụng nhiều hơn bản ghi hoạt động.

Tài liệu này khá tốt và bao gồm các ví dụ về sử dụng nó với MiniTest, Rspec và Cucumber.

https://github.com/bmabey/database_cleaner

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