2016-01-06 46 views
1

我有一個特定的測試,我想編寫它來檢查迴歸。我已經繼承了一個沒有單元測試的Rails環境,並且很少有人通過外部(Rails之外)的方式將其放入數據庫。使用特定的RAILS_ENV進行單個單元測試

單元測試將遍歷數據庫中的特定模型並呈現視圖,確保每個實例仍可在該視圖中正確呈現。我想運行一個開發數據庫實例,通常是生產數據庫(MySQL)的克隆。

數據太大,無法放入燈具中...我想使用'test'sqlite數據庫保留其餘的測試。

所以 - 有沒有辦法來覆蓋單個測試哪個數據庫Rails連接到?

我正在使用Rails 3.2.22。

編輯:

基於Babar's answer,我使用的是:

class MyTest < ActionController::TestCase 

    def setup                  
    @controller = MyController.new          
    end                   

    test "should successfully render all" do        
    begin                  
     connection_config = ActiveRecord::Base.connection_config()     
     ActiveRecord::Base.establish_connection('development')      
     MyModel.find_each do |i|           
     print "#{i.id} - #{i.name}\n"       
     get(:show, {'name' => i.name})         
     end                  
    ensure                  
     ActiveRecord::Base.establish_connection(connection_config)     
     # or ActiveRecord::Base.establish_connection(ENV['RAILS_ENV'])     
    end                   
    end                   
end  

但我在試圖回滾拆解得到一個異常。我認爲這是因爲測試最初是圍繞一個事務進行的,而且由於我交換了數據庫,連接現在已關閉,我們不再處於事務中。

什麼是最直接的解決方法?

編輯:

添加這看起來是最簡單的:

def setup                  
    @controller = DashboardController.new          
    @use_transactional_fixtures = false           
    end                   
+1

您是否正在使用Minitest? Rspec的?還有別的嗎?我假設你希望這個測試總是使用這個特定的環境,而不是隻在命令行執行一個RAILS_ENV = [x]命令? – tirdadc

+0

我希望此特定測試始終使用特定的環境,而不管RAILS_ENV設置爲什麼。 ...實際上我的test_helper.rb具有'ENV [「RAILS_ENV」] =「test」'set,所以我相信RAILS_ENV不能在命令行上覆蓋? (我可以。) – rrauenza

+0

我似乎有我的Gemfile rspec 2.14.1,但我想我使用minitest - 測試類派生自Test :: Unit :: TestCase,ActiveSupport :: TestCase, ActionView :: TestCase,ActionController :: TestCase – rrauenza

回答

1

有一個叫establish_connection一個類的方法,可以做你想做的。只需使用ActiveRecord::Base.establish_connection運行特定測試時連接到不同的數據庫。

ActiveRecord::Base.establish_connection(
    :adapter => "mysql", 
    :host  => "localhost", 
    :username => "myuser", 
    :password => "mypass", 
    :database => "somedatabase" 
) 

您可以使用database.yml文件中的數據庫別名。這將是這樣的:

ActiveRecord::Base.establish_connection('development') 

您可以將它編碼到您的特定測試文件中。

檢查文檔:http://apidock.com/rails/v3.2.1/ActiveRecord/Base/establish_connection/class

+0

認真?就這樣?我一直在尋找好幾天!非常感謝!與您的答案同時,我也剛剛發現http://makandracards.com/makandra/10169-when-connecting-to-a-second-database-take-care-not-to-overwrite-existing-connections其中顯示也把確保回退到默認值。我認爲這是必要的? – rrauenza

+0

我得到一個回滾錯誤,但我認爲這可能是因爲我從ActionController :: TestCase派生。 Test :: Unit :: TestCase工作正常。我可能*需要*其他測試類之一,但爲了模擬頁面渲染? – rrauenza

+0

我是比測試更規範的人!抱歉無法回答。 – Babar