2013-03-19 159 views
0

我是新來的Ruby/Rails和做turorial我想知道我怎麼能解決我的小問題...實用紅寶石軌道創造have_list_of_links爲RSpec的測試

我有一個形容「用有效的信息」測試用戶使用有效信息登錄時應該發生什麼或不應該發生什麼。 在此過程中,我希望能夠驗證新頁面上是否存在某些鏈接。在政黨成員,只有2個環節,所以我們那樣做:

it { should have_link('Profile', href: user_path(user)) } 
it { should have_link('Sign out', href: signout_path) } 

但是如果我們假設10個鏈接?我認爲讓一個幫手不會更容易?但我無法弄清楚如何編寫它。這是我跟...來

然後在$ PROJECT /規格/支持/ utilities.rb文件,我定義了新的* have_list_of_links *功能:

RSpec::Matchers.define :have_list_of_links do |lol| 
    match do |page| 
    lol.each_pair do |label, link| 
       page.should have_link(label, href: link) 
    end 
    end 
end 

我知道這是不正確的做法,但我不知道該怎麼做...

謝謝。

+0

你是什麼意思**我知道這是不應該做的方式**通過看它應該工作,做你所期望的代碼。你有任何錯誤?我可以看到的唯一副作用是所有鏈接都將在單個示例中運行,並且可能不適用於文檔。 – Kocur4d 2013-03-20 02:52:50

+0

其實我不知道這是否是做了正確的方式,這更是我想說的... – jon 2013-03-20 08:56:11

+0

我有一個錯誤信息,我只好等到工作日複製的結束/粘貼這裏。如果我明白你提到的副作用,我不確定。你會不會推薦這種實施測試的方式?但無論如何,最終我的目標只是練習一些不在tuto中編寫的代碼。 – jon 2013-03-20 09:03:05

回答

1

我在這裏可以看到兩個小問題。首先使用let語法在rspec中定義memoized變量。其次,當你建立你的散列時,請在括號裏面加上* _path助手。

所以insted的:

lol = Hash[ 'Profile' => 'user_path(user)', 
      'Sign out' => 'signin_path'] 

有:

let(:lol) { Hash[ 'Profile' => user_path(user), 
        'Sign out' => signin_path] } 

你的描述塊可能是:

describe "with valid information" do 
    let(:lol) { Hash[ 'Profile' => user_path(user), 
        'Sign out' => signin_path] } 

    it { should have_list_of_links(lol) } 
end 

由於副作用,我會告訴你的小例子。鑑於您在$ PROJECT/spec/support/utilities.rb文件中定義了匹配器,應用程序路由等設置正確,並且您在視圖中有鏈接。

describe "Users pages" do 
    before { visit root_path } 
    let(:values) { Hash['Index' => users_path, 
         'Sign out' => signout_path, 
         'Sign in' => signin_path] } 

    subject { page } 

    describe "with valid informations" do 
    it { should have_list_of_links(values) } 
    end 
end 

運行rspec的:

> rspec 
. 

Finished in 0.00267 seconds 
1 example, 0 failures 

Randomized with seed 67346 

運行rspec的-f文件

>rspec -f documentation 
Users pages 
    with valid informations 
    should have link "Sign in" 

Finished in 0.00049 seconds 
1 example, 0 failures 

Randomized with seed 53331 

這是不明確的和誤導性的,特別是文件交換。在新應用程序中運行rspec -f文檔的一種常見做法您只需將手放在其上(如果它們使用rspec ofc)。爲了更好地理解發生了什麼。

如果不是有:

describe "Users pages" do 
    before { visit root_path } 

    subject { page } 

    describe "with valid informations" do 
    it { should have_link('Index', href: users_path) } 
    it { should have_link('Sign out', href: signout_path) } 
    it { should have_link('Sign in', href: signout_path) } 
    end 
end 

運行rspec的:

>rspec 
... 

Finished in 0.0097 seconds 
3 examples, 0 failures 

Randomized with seed 53347 

運行rspec的-f文件

>rspec -f documentation 
Users pages 
    with valid informations 
    should have link "Index" 
    should have link "Sign out" 
    should have link "Sign in" 

Finished in 0.00542 seconds 
3 examples, 0 failures 

Randomized with seed 40120 

我個人比較喜歡第二種情況(更詳細的一個)。隨着測試數量的增長以及測試結構變得越來越複雜,其價值越來越高。您可以簡單地運行rspec -f文檔以瞭解如何使用應用程序,而無需使用用戶手冊/教程。

+0

超級,感謝您的速成班!我會在今天晚上測試你的解決方案並分享結果。 還有一個問題:RSpec和行爲驅動的編程是真的在網絡公司中使用還是更理想的方式來做到這一點? – jon 2013-03-20 13:49:39

+0

好公司測試,壞公司不測試。他們正在測試什麼(RSpec/Minitest /其他框架)只是個人的品味。如果我想說** Rspec和BDD **是「最好的」,你應該在** UnitTest和TDD上使用它**一半的人讀這個問題會把我釘死,另外一半會給我買一杯飲料:) Bottom線是 - 對你測試的東西沒有絲毫影響。只是測試:)。 – Kocur4d 2013-03-20 14:14:00

+0

好的,再次感謝信息,我的東西現在正在工作。我還發現一個非常類似職位 http://stackoverflow.com/questions/11916962/how-to-keep-rspec-tests-dry-with-lots-of-have-link?rq=1 稍微暴露視圖不同。我想我需要繼續嘗試一些「實驗」,我一定會回到這裏。 ciao – jon 2013-03-20 22:06:41