- RSpec 教程
- RSpec - 首页
- RSpec - 简介
- RSpec - 基本语法
- RSpec -编写规范
- RSpec - 匹配器
- RSpec - 测试替身
- RSpec - 存根
- RSpec - 钩子
- RSpec - 标签
- RSpec - 主题
- RSpec - 辅助方法
- RSpec - 元数据
- RSpec - 过滤
- RSpec - 期望
- RSpec 资源
- RSpec - 快速指南
- RSpec - 有用资源
- RSpec - 讨论
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
将其保存在相同的 spec 目录中,命名为 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
恭喜,规范文件中的示例(测试)现在通过了。我们修复了包含元音方法的正则表达式中的一个错误,但我们的测试远未完成。
添加更多示例来测试包含元音方法的各种类型的输入字符串是有意义的。
下表显示了一些可以添加到新示例(it 块)中的排列。
| 输入字符串 | 描述 | 使用 has_vowels? 的预期结果 |
|---|---|---|
| ‘aaa’,‘eee’,‘iii’,‘o’ | 只有一个元音且没有其他字母。 | true |
| ‘abcefg’ | “至少一个元音和一些辅音” | true |
| ‘mnklp’ | 只有辅音。 | false |
| ‘’ | 空字符串(无字母) | false |
| ‘abcde55345&??’ | 元音、辅音、数字和标点符号。 | true |
| ‘423432%%%^&’ | 只有数字和标点符号。 | false |
| ‘AEIOU’ | 只有大写元音。 | true |
| ‘AeiOuuuA’ | 只有大写和小写元音。 | true |
| ‘AbCdEfghI’ | 大写和小写元音和辅音。 | true |
| ‘BCDFG’ | 只有大写辅音。 | false |
| ‘ ‘ | 只有空格字符。 | false |
由您决定将哪些示例添加到您的规范文件中。有很多条件需要测试,您需要确定哪个条件子集最重要以及最能测试您的代码。
rspec 命令提供了许多不同的选项,要查看所有选项,请键入rspec -help。下表列出了最常用的选项并描述了它们的功能。
| 序号 | 选项/标志和说明 |
|---|---|
| 1 | -I PATH 将 PATH 添加到rspec在查找 Ruby 源文件时使用的加载(require)路径。 |
| 2 | -r, --require PATH 添加一个特定的源文件,以便在您的规范文件(s) 中需要。 |
| 3 | --fail-fast 使用此选项,rspec 将在第一个示例失败后停止运行规范。默认情况下,rspec 会运行所有指定的规范文件,无论有多少失败。 |
| 4 | -f, --format FORMATTER 此选项允许您指定不同的输出格式。有关输出格式的更多详细信息,请参阅格式化程序部分。 |
| 5 | -o, --out FILE 此选项指示 rspec 将测试结果写入输出文件 FILE,而不是写入标准输出。 |
| 6 | -c, --color 启用 rspec 输出中的颜色。成功的示例结果将以绿色文本显示,失败将以红色文本显示。 |
| 7 | -b, --backtrace 在 rspec 的输出中显示完整的错误回溯。 |
| 8 | -w, --warnings 在 rspec 的输出中显示 Ruby 警告。 |
| 9 | -P, --pattern PATTERN 加载并运行与模式 PATTERN 匹配的规范文件。例如,如果您传递 -p “*.rb”,rspec 将运行所有 Ruby 文件,而不仅仅是那些以“_spec.rb”结尾的文件。 |
| 10 | -e, --example STRING 此选项指示 rspec 运行其描述中包含文本 STRING 的所有示例。 |
| 11 | -t, --tag TAG 使用此选项,rspec 将仅运行包含标签 TAG 的示例。请注意,TAG 指定为 Ruby 符号。有关详细信息,请参阅 RSpec 标签部分。 |