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

在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}

我只是想了解单元测试背后的基础知识。我在一个名为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
这是我的规范文件:

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期望匹配器的上下文,因此它不仅仅是用于组织。上下文和描述更适合组织目的