2012-03-22 57 views
0

我目前正在開發一個項目,我們開始將我們的測試遷移到獨立測試(沒有rails依賴,並使用存根和mock)。 事情是,直到所有當前的測試都被隔離,我們必須與隔離測試一起運行測試,這將啓動rails環境。Rails在rails下運行的獨立測試env

問題出現在隔離測試中有一個假類(類Foo; end;)時,它將覆蓋其餘測試的原始類。

舉例: 在foo_spec.rb我們這行

class Bar; end; 

這將覆蓋酒吧類下一個非隔離測試,並會導致很多失敗的。

有我可以爲了弄清楚擺脫這2種方法: - 要麼註釋掉當測試與軌道運行的假類env中 - 把孤立的測試在另一個文件夾並運行它們從分離休息(這會更有意義)

你能想出一個更好的方法來處理這個問題嗎?

回答

0

我們正在使用rspec(它不應該改變任何東西),並讓我們的軌道規格位於spec與他們自己的spec_helper.rb文件加載env和所有醜陋的東西。

spec_fast文件夾我們有所有的規格,可以運行沒有軌道,與他們自己的spec-helper,只加載我們獨立的lib文件夾。

我們的CI服務器,我們讓不同的任務既規範文件夾中運行:

if Rails.env.test? 
    require 'rspec/core/rake_task' 
    require 'ci/reporter/rake/rspec' 

    RSpec::Core::RakeTask.new(:all_fast) do |t| 
    t.pattern = 'spec_fast/**/*_spec.rb' 
    end 

    RSpec::Core::RakeTask.new(:all_slow) do |t| 
    t.pattern = 'spec/**/*_spec.rb' 
    end 

    task :all => ["ci:setup:rspec", :all_fast, :all_slow] 
end 

應該也可能只是把它們放在不同的子文件夾像spec/railsspec/fast但我沒有嘗試一下因爲它意味着在spec文件中做很多路徑改變。

+0

謝謝phoet,我認爲這可能是最好的方式來處理這個現在 – 2012-03-23 09:32:43

+0

所以沒有答案是可以接受的嗎? – phoet 2012-03-23 20:53:47

0

我不知道它是不是正確,但我最終沒有實際分配這樣的上下文虛擬手動創建虛擬類常量。

相反的:

#no 
class Foo 
    #something 
end 

相反:

foo = Class.new do 
    #stuff 
end 

你可以foo.new或foo.class_method你的心臟的內容。也可以在@foo中。但是你並沒有像普通的類定義那樣將它分配給常量Foo,你正在創建一個'匿名'類並將它分配給一個普通變量,它的作用範圍就在你需要的區域內。

注意:我並不是說這是用rspec做的事情的「正確」方式,我從來沒有想過我知道做正確的事情,正確的做法可能是以某種方式不創建這樣的類所有,或者使用一些我不明白的怪異的工廠女孩​​東西或什麼。但是當我需要創建'虛擬'類型的類時,只是針對特定測試或塊的範圍,這就是我所做的。

+0

你有一個很好的觀點,但是如果Bar類的實現中有一行說'Foo.getX'?我無法找到這個類,所以你的方法在這種情況下不起作用。 – 2012-03-23 09:34:47