RSpec - 匹配器


如果您还记得我们最初的 Hello World 示例,它包含一行,如下所示 -

expect(message).to eq "Hello World!"

关键字 eql 是一个RSpec “匹配器”。在这里,我们将介绍 RSpec 中其他类型的匹配器。

平等/身份匹配器

用于测试对象或值相等性的匹配器。

匹配器 描述 例子
情商 当实际 == 预期时通过 期望(实际).to eq 期望
情商 当实际.eql?(预期)时通过 预期(实际).to eql预期
当实际.等于?(预期)时通过 预期(实际)。预期
平等的 当实际.等于?(预期)时也通过 期望(实际).等于期望

例子

describe "An example of the equality Matchers" do 

   it "should show how the equality Matchers work" do 
      a = "test string" 
      b = a 
      
      # The following Expectations will all pass 
      expect(a).to eq "test string" 
      expect(a).to eql "test string" 
      expect(a).to be b 
      expect(a).to equal b 
   end
   
end

当执行上述代码时,将产生以下输出。您的计算机上的秒数可能略有不同 -

.
Finished in 0.036 seconds (files took 0.11901 seconds to load)
1 example, 0 failures

比较匹配器

用于与值进行比较的匹配器。

匹配器 描述 例子
> 当实际>预期时通过 期望(实际).to > 预期
>= 当实际 >= 预期时通过 期望(实际).to >= 预期
< 当实际 < 预期时通过 期望(实际).to < 预期
<= 当实际 <= 预期时通过 期望(实际).to <= 预期
包含在内 当实际值 <= min 且 >= max 时通过 期望(实际).to be_ Between(min, max).inclusive
be_ Between 排他性 当实际值 < 最小值且 > 最大值时通过 Expect(实际).to be_ Between(min, max).exclusive
匹配 当实际匹配正则表达式时通过 期望(实际).匹配(/正则表达式/)

例子

describe "An example of the comparison Matchers" do

   it "should show how the comparison Matchers work" do
      a = 1
      b = 2
      c = 3		
      d = 'test string'
      
      # The following Expectations will all pass
      expect(b).to be > a
      expect(a).to be >= a 
      expect(a).to be < b 
      expect(b).to be <= b 
      expect(c).to be_between(1,3).inclusive 
      expect(b).to be_between(1,3).exclusive 
      expect(d).to match /TEST/i 
   end
   
end

当执行上述代码时,将产生以下输出。您的计算机上的秒数可能略有不同 -

. 
Finished in 0.013 seconds (files took 0.11801 seconds to load) 
1 example, 0 failures

类/类型匹配器

用于测试对象类型或类的匹配器。

匹配器 描述 例子
成为实例 当实际是预期类的实例时通过。 期望(实际).to be_instance_of(预期)
是_kind_of 当实际是预期类或其任何父类的实例时通过。 期望(实际).to be_kind_of(预期)
回应 当实际响应指定方法时通过。 期望(实际)。响应(预期)

例子

describe "An example of the type/class Matchers" do
 
   it "should show how the type/class Matchers work" do
      x = 1 
      y = 3.14 
      z = 'test string' 
      
      # The following Expectations will all pass
      expect(x).to be_instance_of Fixnum 
      expect(y).to be_kind_of Numeric 
      expect(z).to respond_to(:length) 
   end
   
end

当执行上述代码时,将产生以下输出。您的计算机上的秒数可能略有不同 -

. 
Finished in 0.002 seconds (files took 0.12201 seconds to load) 
1 example, 0 failures

True/False/Nil 匹配器

用于测试值是否为真、假或零的匹配器。

匹配器 描述 例子
是真实的 当实际 == true 时通过 期望(实际)为真
是假的 当实际 == false 时通过 期望(实际).为假
真实 当实际不为 false 或 nil 时通过 期望(实际).to be_truthy
是假的 当实际为 false 或 nil 时通过 期望(实际).to be_falsey
当实际为零时通过 期望(实际).to be_nil

例子

describe "An example of the true/false/nil Matchers" do
   it "should show how the true/false/nil Matchers work" do
      x = true 
      y = false 
      z = nil 
      a = "test string" 
      
      # The following Expectations will all pass
      expect(x).to be true 
      expect(y).to be false 
      expect(a).to be_truthy 
      expect(z).to be_falsey 
      expect(z).to be_nil 
   end 
end

当执行上述代码时,将产生以下输出。您的计算机上的秒数可能略有不同 -

. 
Finished in 0.003 seconds (files took 0.12301 seconds to load) 
1 example, 0 failures

错误匹配器

当代码块引发错误时,用于测试的匹配器。

匹配器 描述 例子
raise_error(错误类) 当块引发 ErrorClass 类型的错误时通过。 期望 {block}.to raise_error(ErrorClass)
raise_error("错误信息") 当块引发错误并显示“错误消息”消息时通过。 期望 {block}.to raise_error(“错误消息”)
raise_error(ErrorClass, "错误信息") 当块引发 ErrorClass 类型的错误并显示消息“错误消息”时通过 期望 {block}.to raise_error(ErrorClass,“错误消息”)

例子

将以下代码保存到名为error_matcher_spec.rb 的文件中,并使用此命令运行它 - rspec error_matcher_spec.rb

describe "An example of the error Matchers" do 
   it "should show how the error Matchers work" do 
      
      # The following Expectations will all pass 
      expect { 1/0 }.to raise_error(ZeroDivisionError)
      expect { 1/0 }.to raise_error("divided by 0") 
      expect { 1/0 }.to raise_error("divided by 0", ZeroDivisionError) 
   end 
end

当执行上述代码时,将产生以下输出。您的计算机上的秒数可能略有不同 -

. 
Finished in 0.002 seconds (files took 0.12101 seconds to load) 
1 example, 0 failures