在ruby中首次使用rspec进行单元测试
我只是想了解单元测试背后的基础知识。我在一个名为Player.rb的文件中编写了一个Player类。代码如下:在ruby中首次使用rspec进行单元测试,ruby,unit-testing,rspec,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}
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
这是我的规范文件:
require_relative 'Player'
describe Player do
it "has a capitalized name" do
player = Player.new("larry", 150)
player.name.should == "Larry"
end
end
这似乎是对的吗?我的问题是关于spec文件的语法。我理解为什么我需要玩家类。但是代码中的描述和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)>'.
弃用警告:
使用rspec expectations'old`:should`语法而不显式启用该语法是不推荐的。使用新的“:expect”语法或显式启用“:should”。从/Users/Jwan/studio_game/player_spec.rb:7:in‘block(2层)in’调用。
上述警告是什么意思?我必须用enable语法替换should吗?如何启用:should语法?为什么:应该写为一个符号?是的,这似乎是正确的。您可能会发现一件有用的事情是使用
subject
,它允许您定义在多个测试中使用的“subject”:
describe Player do
subject { Player.new("larry", 150) }
it "has a capitalized name" do
expect(subject.name).to eq "Larry"
end
end
这样,您就不必在每次测试中反复定义player
,主题每次都会自动为您初始化
描述
和it
主要用于组织。一个大型项目最终将有数千个测试,而一个类中的更改可能会导致应用程序完全不同部分的测试失败。保持测试的条理化可以更容易地发现和修复错误
至于您的警告,看起来您使用的是一个旧的指南或教程,它告诉您使用“应该”语法,但在RSpec 3中,此语法已被弃用,而需要使用“预期”语法。您可以看到我如何在上面更改代码以使用“expect”语法。下面介绍新语法(以及旧语法被弃用的原因)。是的,这似乎是正确的。您可能会发现一件有用的事情是使用subject
,它允许您定义在多个测试中使用的“subject”:
describe Player do
subject { Player.new("larry", 150) }
it "has a capitalized name" do
expect(subject.name).to eq "Larry"
end
end
这样,您就不必在每次测试中反复定义player
,主题每次都会自动为您初始化
描述
和it
主要用于组织。一个大型项目最终将有数千个测试,而一个类中的更改可能会导致应用程序完全不同部分的测试失败。保持测试的条理化可以更容易地发现和修复错误
至于您的警告,看起来您使用的是一个旧的指南或教程,它告诉您使用“应该”语法,但在RSpec 3中,此语法已被弃用,而需要使用“预期”语法。您可以看到我如何在上面更改代码以使用“expect”语法。下面介绍新语法(以及旧语法被弃用的原因)。它设置了一个实际示例。一个例子可以被认为是一个包含一个或多个期望的实际测试(最佳实践是每个例子一个期望)。
expect
方法和匹配器仅存在于it
块中。使用let
和subject
设置的变量对于每个示例都是唯一的
scenario
是功能(验收)规范中使用的it
的别名
描述
,上下文
和功能
用于将示例分组在一起。这为let
和subject
变量提供了可读性和封装性
将类传递给description
也会设置隐式主题:
RSpec.describe Array do
describe "when first created" do
it { is_expected.to be_empty }
end
end
相对而言,RSpec最近经历了一次大的转变,即消除了“猴子补丁”核心ruby类,这降低了should
语法的价值
虽然建议在新项目中使用expect
,但您应该和其他猴子补丁方法。
建立了一个实际的例子。一个例子可以被认为是一个包含一个或多个期望的实际测试(最佳实践是每个例子一个期望)。
expect
方法和匹配器仅存在于it
块中。使用let
和subject
设置的变量对于每个示例都是唯一的
scenario
是功能(验收)规范中使用的it
的别名
描述
,上下文
和功能
用于将示例分组在一起。这为let
和subject
变量提供了可读性和封装性
将类传递给description
也会设置隐式主题:
RSpec.describe Array do
describe "when first created" do
it { is_expected.to be_empty }
end
end
相对而言,RSpec最近经历了一次大的转变,即消除了“猴子补丁”核心ruby类,这降低了should
语法的价值
虽然建议在新项目中使用expect
,但您应该使用和其他猴子补丁方法。基本上都是这样。另外,it
块定义了您可以访问RSpecs期望匹配器的上下文,因此它不仅仅是用于组织。上下文和描述更适合于组织目的。另外,it
块定义了您可以访问RSpecs期望匹配器的上下文,因此它不仅仅是用于组织。上下文和描述更适合组织目的