2012-09-12 35 views
15

Chúng tôi có một mô hình Hộp thư sử dụng một DB phụ mà một ứng dụng thư khác cũng kết nối. Điều này được gọi bằngkiểm tra và database_cleaner cho nhiều cơ sở dữ liệu

establish_connection :mail_database 

Bây giờ, tôi cho rằng tôi có thể cố gắng để quấn rằng trong một tuyên bố if nên nó sử dụng một kết nối khác nhau cho các môi trường kiểm tra, nhưng tôi đang tự hỏi làm thế nào tôi có thể giữ cho cơ sở dữ liệu này sạch sẽ, tốt nhất sử dụng database_cleaner mà chúng tôi đã sử dụng cho cơ sở dữ liệu 'thông thường'.

Tôi hy vọng một người nào đó có thể thúc đẩy tôi đi đúng hướng.

+0

Tôi hy vọng bạn tìm ra một giải pháp năm ngoái chúng tôi đã đối phó với vấn đề này và nó đã hundres thử và lặp đi lặp lại lỗi, và cuối cùng giải pháp là một hack hoàn toàn lộn xộn. – fguillen

+0

@fguillen bạn có thể đi vào chi tiết không? Rất vui khi biết bạn đã làm như thế nào – HannesFostie

+0

Như tôi đã nói đó là một hack lộn xộn rất khó nhớ, bây giờ tôi thấy trạng thái thực tế của dự án và tôi thấy họ vừa hoàn thành việc thêm phương thức 'test_helper.rb' với rất nhiều 'ModelName.destroy_all' :) – fguillen

Trả lời

11

Tôi có ứng dụng rails3.2.10 được thử nghiệm với rspec (2.12.0) và sử dụng database_cleaner (0.9.1 f4b44bb) có hai kết nối cơ sở dữ liệu cho mysql.

Đây là những thiết lập trong database.yml cái gì đó như:

test: 
    ... 
    database: my_app_test 

test_my_second_connection: 
    ... 
    database: my_second_connection_test 

Cơ sở dữ liệu thứ hai được kết nối trong lớp mô hình với thiết lập kết nối.

tôi đã có thể sử dụng các cài đặt sau trong spec của tôi/spec_helper.rb tập tin theo manual of database_cleaner:

require 'database_cleaner' 

RSpec.configure do |config| 

    config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :transaction 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].clean 
    end 

end 

Bên cạnh đó tôi có để sử dụng cho một số bộ phận của bài kiểm tra bộ đồ đạc không giao dịch . Vì vậy, tôi đã có thêm những thông tin meta : db_truncate => true trong thông số kỹ thuật của tôi và các thiết lập như thế này để thay đổi chiến lược trong chạy thử:

config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :transaction 
end 

config.before(:each) do 
    if example.metadata[:db_truncation] 
    DatabaseCleaner.strategy = :truncation 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :truncation 
    else 
    DatabaseCleaner.start 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].start 
    end 
end 

config.after(:each) do 
    DatabaseCleaner.clean 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].clean 
    if example.metadata[:db_truncation] 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :transaction 
    end 
end 
+0

Một đồng nghiệp đã tìm thấy điều này, nhưng nó thực sự là giải pháp. Cảm ơn bạn – HannesFostie

+5

Tôi có cùng một tình huống (trên Rails 3.2.12 và Rspec 2.14.7) với kết nối tới cơ sở dữ liệu thứ hai trong một trong các mô hình của tôi. Khi tôi thiết lập DatabaseCleaner theo cách này, dường như TẤT CẢ các mô hình của tôi cố gắng kết nối với cơ sở dữ liệu thứ hai, và tất nhiên mọi thứ thất bại vì các bảng không có trong cơ sở dữ liệu thứ hai –

+0

@ChristerFernstrom –

2
****set database to clean by database cleaner in rails:-**** 
config.before(:suite) do 
    DatabaseCleaner[:active_record, :connection => :test].clean_with(:truncation) 
end 

config.before(:each) do 
    DatabaseCleaner[:active_record, :connection => :test].strategy = :transaction 
end 

config.before(:each) do 
    DatabaseCleaner[:active_record, :connection => :test].start 
end 

config.after(:each) do 
    DatabaseCleaner[:active_record, :connection => :test].clean 
end 
Các vấn đề liên quan