2014-10-20 71 views
1

我只是想了解单元测试背后的基础知识。我在一个名为Player.rb的文件中写了一个Player类。下面是代码:在ruby中使用rspec进行首次单元测试

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文件的语法。我明白为什么我需要玩家类。但是描述的是代码段的做法是什么?为什么我需要部分?所有似乎在做的是定义一个字符串的权利?

最后,当我运行从终端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语法?为什么是:应该写成符号?

回答

6

是的,这似乎是正确的。你可能会发现有用的一件事是使用subject,它可以让你定义一个“主题”,在多个测试使用方法:

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

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

这样你就不必一遍又一遍在每一个测试 - 再定义playersubject会每次为您自动初始化它。

describeit主要用于组织。一个大型项目最终会有数千个测试,而一个类中的更改可能会导致测试失败,导致完全不同的应用程序部分。保持测试的组织性使其更容易找到并修复发生的错误。

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

+1

相当多。另外,'it'块定义了您可以访问RSpec期望匹配器的上下文,因此它不是纯粹用于组织。上下文和描述将更多用于组织目的 – 2014-10-20 15:44:53

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已经relativly最近经过努力消除其折旧should语法“猴子补丁”的核心Ruby类大转变。

虽然建议使用expect为新的项目,你can allowshould和其他猴子修补方法。