RSpec - 基本语法


让我们仔细看看HelloWorld示例的代码。首先,如果还不清楚,我们正在测试HelloWorld类的功能。当然,这是一个非常简单的类,仅包含一个方法say_hello()

这是 RSpec 代码 -

describe HelloWorld do 
   context “When testing the HelloWorld class” do 
      
      it "The say_hello method should return 'Hello World'" do 
         hw = HelloWorld.new 
         message = hw.say_hello 
         expect(message).to eq "Hello World!" 
      end
      
   end 
end

描述关键字

单词“describe”是一个 RSpec 关键字。它用于定义“示例组”。您可以将“示例组”视为测试的集合。描述关键字可以采用类名和/或字符串参数您还需要传递一个块参数来描述,这将包含各个测试,或者如 RSpec 中所称的“示例”。该块只是由 Ruby do/end关键字指定的 Ruby 块。

上下文关键字

context关键字与describe类似。它也可以接受类名和/或字符串参数。您还应该使用带有上下文的块。上下文的想法是它包含某种类型的测试。

例如,您可以指定具有不同上下文的示例组,如下所示 -

context “When passing bad parameters to the foobar() method” 
context “When passing valid parameters to the foobar() method” 
context “When testing corner cases with the foobar() method”

context关键字不是强制性的,但它有助于添加有关其包含的示例的更多详细信息。

it 关键字

it一词是另一个 RSpec 关键字,用于定义“示例”。示例基本上是一个测试或测试用例。同样,与describecontext一样,它接受类名和字符串参数,并且应该与块参数一起使用,用do/end指定。在it的情况下,通常只传递字符串和块参数。字符串参数经常使用“should”一词,旨在描述it 块内应该发生什么特定Behave。换句话说,它描述了示例的预期结果。

请注意我们的 HelloWorld 示例中的it 块-

it "The say_hello method should return 'Hello World'" do

该字符串清楚地表明了当我们在 HelloWorld 类的实例上调用 say hello 时会发生什么。RSpec哲学的这一部分,一个Example不仅仅是一个测试,它也是一个规范(a spec)。换句话说,示例既记录又测试 Ruby 代码的预期Behave。

期望关键字

Expect关键字用于定义 RSpec 中的“期望”。这是一个验证步骤,我们检查是否满足特定的预期条件。

从我们的 HelloWorld 示例中,我们有 -

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

期望语句的想法是它们读起来像普通英语。您可以大声说出“期望变量消息等于字符串‘Hello World’”。这个想法是它具有描述性并且易于阅读,即使对于项目经理等非技术利益相关者来说也是如此。

The to keyword

to关键字用作expect语句的一部分。请注意,当您希望 Expectation 为 false 时,您还可以使用not_to关键字来表达相反的意思。您可以看到 to 与一个点一起使用,expect(message).to,因为它实际上只是一个常规的 Ruby 方法。事实上,所有 RSpec 关键字实际上只是 Ruby 方法。

The eql keyword

eql关键字是一个特殊的 RSpec 关键字称为 Matcher。您可以使用匹配器来指定您要测试的条件类型为真(或假)。

在我们的HelloWorld Expect语句中,很明显eql意味着字符串相等。请注意,Ruby 中存在不同类型的相等运算符,因此 RSpec 中对应的匹配器也不同。我们将在后面的部分中探讨许多不同类型的匹配器。