我只是想了解单元测试背后的基础知识。我在一个名为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语法?为什么:应该写成符号?
答案 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
每次都会自动为您初始化。
describe
和it
主要用于组织。一个大型项目最终将有数千个测试,一个类的更改可能会导致测试失败,因为完全不同的应用程序部分。保持测试的有序性可以更容易地发现和修复错误。
至于你的警告,看起来你正在使用旧的指南或教程告诉你使用“should”语法,但在RSpec 3中,这种语法已被弃用,而且需要“expect”语法。您可以看到我如何更改上面的代码以使用“expect”语法。这里是关于新语法的a good blog post(以及为什么不推荐使用旧语法)。
答案 1 :(得分:2)
it
设置了一个实际示例。可以将一个示例视为包含一个或多个期望的实际测试(最佳实践表示每个示例的一个期望)。
expect
方法和匹配器仅存在于it
块中。使用let
和subject
设置的变量对于每个示例都是唯一的。
scenario
是功能(验收)规范中使用的it
的别名。
describe
,context
和feature
用于将示例组合在一起。这为let
和subject
变量提供了可读性和封装。
将类传递给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
和其他猴子修补方法。