在ruby中首次使用rspec进行单元测试

时间:2014-10-20 15:11:30

标签: ruby unit-testing rspec

我只是想了解单元测试背后的基础知识。我在一个名为Player.rb的文件中写了一个Player类。这是代码:

Class Player

  attr_reader :health
  attr_accessor :name

 def initialize(name, health=100)
    @name = name.capitalize
    @health = health
 end

 def blam
    @health -= 10
    puts "#{@name} just got blammed yo."
 end

 def w00t
    @health += 15
    puts "#{@name} just got w00ted."
 end

 def score
    @health + @name.length
 end

 def name=(new_name)
    @name = new_name.capitalize
 end

 def to_s
    puts "I'm #{@name} with a health of #{@health} and a score of #{score}"
 end
end

这是我的spec文件:

require_relative 'Player'

describe Player do
    it "has a capitalized name" do
        player = Player.new("larry", 150)

        player.name.should == "Larry"
    end
end

这看起来是对的吗?我的问题是关于spec文件的语法。我明白为什么我需要要求Player类。但是代码的 describe it 部分是做什么的?为什么我需要 it 部分?所有 it 似乎正在做的是定义一个字符串吗?

最后,当我从终端运行rspec player_spec.rb时,我收到此警告:

Deprecation Warnings:

Using `should` from rspec-expectations' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` instead. Called from /Users/Jwan/studio_game/player_spec.rb:7:in `block (2 levels) in <top (required)>'.

上述警告是什么意思?我是否必须使用启用语法替换 should ?如何启用:should语法?为什么:应该写成符号?

2 个答案:

答案 0 :(得分:6)

是的,这似乎是正确的。您可能会发现有用的一件事是使用subject,它允许您定义要在多个测试中使用的“主题”:

describe Player do
  subject { Player.new("larry", 150) }

  it "has a capitalized name" do
    expect(subject.name).to eq "Larry"
  end
end

这样您就不必在每次测试中反复定义player - subject每次都会自动为您初始化。

describeit主要用于组织。一个大型项目最终将有数千个测试,一个类的更改可能会导致测试失败,因为完全不同的应用程序部分。保持测试的有序性可以更容易地发现和修复错误。

至于你的警告,看起来你正在使用旧的指南或教程告诉你使用“should”语法,但在RSpec 3中,这种语法已被弃用,而且需要“expect”语法。您可以看到我如何更改上面的代码以使用“expect”语法。这里是关于新语法的a good blog post(以及为什么不推荐使用旧语法)。

答案 1 :(得分:2)

it 设置了一个实际示例。可以将一个示例视为包含一个或多个期望的实际测试(最佳实践表示每个示例的一个期望)。 expect方法和匹配器仅存在于it块中。使用letsubject设置的变量对于每个示例都是唯一的。

scenario是功能(验收)规范中使用的it的别名。

describe contextfeature用于将示例组合在一起。这为letsubject变量提供了可读性和封装。

将类传递给describe也会设置一个隐含的主题:

RSpec.describe Array do
  describe "when first created" do
    it { is_expected.to be_empty }
  end
end

RSpec最近经历了一次大规模的转变,消除了“猴子修补”核心ruby类,这些类贬低了should语法。

虽然建议您对新项目使用expect,但是can allow should和其他猴子修补方法。