在一个文件中使用Rspec,例如test / unit

时间:2017-01-22 17:15:12

标签: ruby unit-testing rspec sublimetext3

当我有时间时,我想在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编辑器中运行脚本进行测试(并获取输出),我怎样才能更好地重新测试这个测试?

2 个答案:

答案 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