当我有时间时,我想在codewars接受挑战。
到目前为止,我使用test/unit
进行单元测试,但我现在想使用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
这在Sublime中提供以下输出
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
在Sublime文本中,我没有输出,只有一个空的黑色窗口,其中包含执行脚本所花费的时间,如果我使用控制台并运行rspec anagram.rb
我得到
.
Finished in 0.001 seconds (files took 0.10601 seconds to load)
1 example, 0 failures
如何将我的代码和测试放在同一个文件中,只需在我的Sublime Text编辑器中运行脚本进行测试(并获取输出),我怎样才能更好地重新测试这个测试?
答案 0 :(得分: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 :(得分:2)
我不知道您使用sublime文本自动运行单元测试的魔力。 我能回答的是如何更好地说明测试。
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
&amp; contain_exactly
是相同的,除了match_array需要1个参数:array并且完全不需要数组,而是列出所有数组的成员。
https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/contain-exactly-matcher
如果您愿意,也可以将其分为2个或更多规格。如果逻辑更复杂,我会这样做。无论如何要去这里做,所以你可以看到更多rspec消息的例子。不再推荐在规范名称中使用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