2017-01-22 67 views
2

當我有時間的時候我喜歡在codewars接受挑戰。 到現在爲止,我用test/unit來做我的單元測試,但我現在想用Rspec而不改變我的工作方式。這些是小的方法/文件/測試,所以我喜歡將所有內容放在一個腳本中。在一個文件中使用Rspec,如測試/單元

我使用Sublime Text運行幾乎所有的代碼,並在編輯器底部的窗口中獲取結果。

這裏我的工作test/unit例如

require 'test/unit' 

def anagrams(word, words) 
    words.select { |w| w.chars.sort == word.chars.sort } 
end 

class MyTest < Test::Unit::TestCase 
    def test_fail 
    assert_equal(['aabb', 'bbaa'], anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada'])) 
    assert_equal(['carer', 'racer'], anagrams('racer', ['crazer', 'carer', 'racar', 'caers', 'racer'])) 
    assert_equal([], anagrams('laser', ['lazing', 'lazy', 'lacer'])) 
    end 
end 

這給出崇高下面的輸出

Loaded suite C:/Users/.../codewars/anagram 
Started 
. 

Finished in 0.001 seconds. 
------ 
1 tests, 3 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications 
100% passed 
------ 
1000.00 tests/s, 3000.00 assertions/s 
[Finished in 0.3s] 

在這裏,我嘗試了Rspec的

require 'rspec' 

describe "Anagrams" do 
    def anagrams(word, words) 
    words.select { |w| w.chars.sort == word.chars.sort } 
    end 

    it "should only match the anagrams" do 
    anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']) == ['aabb', 'bbaa'] 
    end 
end 

在崇高的文本,我得到沒有輸出,如果我使用的話,只需一個空白的黑色窗口就可以執行腳本控制檯和運行rspec anagram.rb我得到

. 

Finished in 0.001 seconds (files took 0.10601 seconds to load) 
1 example, 0 failures 

我怎麼有我在同一個文件中的代碼和測試,只是通過運行在我崇高的文本編輯器中的腳本做了測試(和得到的輸出),以及如何我可以更好地重述這個測試?

回答

2

您只需告訴RSpec::Core::Runner即可運行您的規格。

在填充結束時添加RSpec::Core::Runner.run([$__FILE__])應該可以工作。

更新代碼:

require 'rspec' 

describe "Anagrams" do 
    def anagrams(word, words) 
    words.select { |w| w.chars.sort == word.chars.sort } 
    end 

    it "should only match the anagrams" do 
    anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']) == ['aabb', 'bbaa'] 
    end 
end 

RSpec::Core::Runner.run([$__FILE__]) 
+1

您設法爲我獲得最重要的權利Stanko,與Sublime的融合,精彩!! – peter

+0

很高興喜歡這個解決方案:) –

2

我不知道你用什麼神奇的崇高文本自動運行單元測試。 我能回答的是如何更好地說明測試。

require 'rspec' 

def anagrams(word, words) 
    words.select { |w| w.chars.sort == word.chars.sort } 
end 

RSpec.describe "Anagrams" do 
    it "matches words that are anagrams" do 
    # 2 different ways to do this 
    expect(anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada'])).to match_array(['aabb', 'bbaa']) 
    expect(anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada'])).to contain_exactly('aabb', 'bbaa') 
    end 
end 

match_array & contain_exactly是相同的,不同之處在於match_array需要1個參數:數組和包含完全相同不需要陣列,而不是你列出陣列的所有承包商,客人。

https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/contain-exactly-matcher

你也可以,如果你想打入2種或更多規格此。如果邏輯更復雜,我會這麼做。無論如何要在這裏做,所以你可以看到rspec消息的更多例子。不再推薦使用spec中的should。

RSpec.describe "Anagrams" do 
    it "when no annagrams found returns empty array" do 
    expect(anagrams('abba', ['abcd', 'dada'])).to eq([]) 
    end 

    it "recognizes itself as annagram" do 
    expect(anagrams('abba', ['abba'])).to eq(['abba']) 
    end 

    it "returns array containing words that are anagrams" do 
    expect(anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada'])).to contain_exactly('aabb', 'bbaa') 
    end 
end 
+0

我把你的第一個Rspec例子與Stanko的解決方案結合起來,它的功能非常完美,希望我可以將你們兩個都標記爲答案,來爲這兩位英雄投票 – peter

+0

很高興看到它幫助:) –

相關問題