RSpec - 编写规范
在本章中,我们将创建一个新的 Ruby 类,将其保存在自己的文件中,并创建一个单独的规范文件来测试该类。
首先,在我们的新类中,它称为StringAnalyzer。您猜对了,这是一个简单的类,用于分析字符串。我们的类只有一个方法has_vowels? 顾名思义,如果字符串包含元音则返回 true,否则返回 false。这是StringAnalyzer的实现-
class StringAnalyzer def has_vowels?(str) !!(str =~ /[aeio]+/i) end end
如果您按照 HelloWorld 部分进行操作,则会创建一个名为 C:\rspec_tutorial\spec 的文件夹。
如果有 hello_world.rb 文件,请将其删除,并将上面的 StringAnalyzer 代码保存到 C:\rspec_tutorial\spec 文件夹中名为 string_analyzer.rb 的文件中。
这是我们用于测试 StringAnalyzer 的规范文件的来源 -
require 'string_analyzer' describe StringAnalyzer do context "With valid input" do it "should detect when a string contains vowels" do sa = StringAnalyzer.new test_string = 'uuu' expect(sa.has_vowels? test_string).to be true end it "should detect when a string doesn't contain vowels" do sa = StringAnalyzer.new test_string = 'bcdfg' expect(sa.has_vowels? test_string).to be false end end end
将其保存在同一规范目录中,并将其命名为 string_analyzer_test.rb。
在 cmd.exe 窗口中,cd 到 C:\rspec_tutorial 文件夹并运行以下命令:dir spec
您应该看到以下内容 -
C:\rspec_tutorial\spec 目录
09/13/2015 08:22 AM <DIR> . 09/13/2015 08:22 AM <DIR> .. 09/12/2015 11:44 PM 81 string_analyzer.rb 09/12/2015 11:46 PM 451 string_analyzer_test.rb
现在我们要运行我们的测试,运行这个命令:rspec spec
当您将文件夹的名称传递给rspec时,它会运行该文件夹内的所有规范文件。你应该看到这个结果 -
No examples found. Finished in 0 seconds (files took 0.068 seconds to load) 0 examples, 0 failures
发生这种情况的原因是,默认情况下,rspec只运行名称以“_spec.rb”结尾的文件。将 string_analyzer_test.rb 重命名为 string_analyzer_spec.rb。您可以通过运行以下命令轻松做到这一点 -
ren spec\string_analyzer_test.rb string_analyzer_spec.rb
现在,再次运行rspec spec,您应该看到如下所示的输出 -
F. Failures: 1) StringAnalyzer With valid input should detect when a string contains vowels Failure/Error: expect(sa.has_vowels? test_string).to be true expected true got false # ./spec/string_analyzer_spec.rb:9:in `block (3 levels) in <top (required)>' Finished in 0.015 seconds (files took 0.12201 seconds to load) 2 examples, 1 failure Failed examples: rspec ./spec/string_analyzer_spec.rb:6 # StringAnalyzer With valid input should detect when a string contains vowels Do you see what just happened? Our spec failed because we have a bug in StringAnalyzer. The bug is simple to fix, open up string_analyzer.rb in a text editor and change this line: !!(str =~ /[aeio]+/i) to this: !!(str =~ /[aeiou]+/i)
现在,保存您刚刚在 string_analyizer.rb 中所做的更改并再次运行 rspec spec 命令,您现在应该看到如下所示的输出 -
.. Finished in 0.002 seconds (files took 0.11401 seconds to load) 2 examples, 0 failures
恭喜,您的规范文件中的示例(测试)现已通过。我们修复了正则表达式中包含元音方法的错误,但我们的测试还远未完成。
添加更多使用 has元音方法测试各种类型的输入字符串的示例是有意义的。
下表显示了可以在新示例中添加的一些排列(它阻止)
输入字符串 | 描述 | has_vowels 的预期结果? |
---|---|---|
'aaa'、'eee'、'iii'、'o' | 只有一个元音,没有其他字母。 | 真的 |
'abcefg' | “至少一个元音和一些辅音” | 真的 |
'mnklp' | 只有辅音。 | 错误的 |
” | 空字符串(无字母) | 错误的 |
'abcde55345&??' | 元音、辅音、数字和标点符号。 | 真的 |
'423432%%%^&' | 仅限数字和标点符号。 | 错误的 |
'艾欧' | 仅大写元音。 | 真的 |
'艾欧欧阿' | 仅大写字母和小元音。 | 真的 |
'AbCdEfghI' | 大写和小写元音和辅音。 | 真的 |
'BCDFG' | 仅限大写辅音。 | 错误的 |
'' | 仅限空白字符。 | 错误的 |
由您决定将哪些示例添加到您的规范文件中。有许多条件需要测试,您需要确定哪些条件子集最重要并最好地测试您的代码。
rspec命令提供了许多不同的选项,要查看所有选项,请键入rspec -help。下表列出了最流行的选项并描述了它们的用途。
先生。 | 选项/标志和描述 |
---|---|
1 | -I 路径 将 PATH 添加到rspec在查找 Ruby 源文件时使用的加载(必需)路径。 |
2 | -r, --需要路径 添加规范中所需的特定源文件。文件。 |
3 | --快速失败 使用此选项,rspec 将在第一个示例失败后停止运行规范。默认情况下,rspec 运行所有指定的规范文件,无论有多少次失败。 |
4 | -f, --format 格式化程序 此选项允许您指定不同的输出格式。有关输出格式的更多详细信息,请参阅格式化程序部分。 |
5 | -o, --out 文件 此选项指示 rspec 将测试结果写入输出文件 FILE 而不是标准输出。 |
6 | -c,--颜色 在 rspec 的输出中启用颜色。成功的示例结果将以绿色文本显示,失败将以红色文本打印。 |
7 | -b,--回溯 在 rspec 的输出中显示完整的错误回溯。 |
8 | -w, --警告 在 rspec 的输出中显示 Ruby 警告。 |
9 | -P, --pattern 模式 加载并运行与模式 PATTERN 匹配的规范文件。例如,如果您传递 -p “*.rb”,rspec 将运行所有 Ruby 文件,而不仅仅是以“_spec.rb”结尾的文件。 |
10 | -e, --示例字符串 此选项指示 rspec 运行描述中包含文本 STRING 的所有示例。 |
11 | -t, --tag 标签 使用此选项,rspec 将仅运行包含标签 TAG 的示例。请注意,TAG 被指定为 Ruby 符号。有关更多详细信息,请参阅有关 RSpec 标签的部分。 |