📜  RSpec-筛选

📅  最后修改于: 2020-12-06 10:58:30             🧑  作者: Mango


在阅读本节之前,您可能需要阅读有关RSpec元数据的部分,因为事实证明,RSpec筛选基于RSpec元数据。

假设您有一个规范文件,它包含两种类型的测试(示例):正功能测试和负(错误)测试。让我们这样定义它们-

RSpec.describe "An Example Group with positive and negative Examples" do 
   context 'when testing Ruby\'s build-in math library' do
      
      it 'can do normal numeric operations' do 
         expect(1 + 1).to eq(2) 
      end 
      
      it 'generates an error when expected' do
         expect{1/0}.to raise_error(ZeroDivisionError) 
      end
      
   end 
end

现在,将上面的文本保存为名为“ filter_spec.rb”的文件,然后使用此命令运行它-

rspec filter_spec.rb

您将看到类似以下内容的输出-

.. 
Finished in 0.003 seconds (files took 0.11201 seconds to load) 
2 examples, 0 failures

现在,如果只想重新运行此文件中的阳性测试该怎么办?还是只有阴性测试?我们可以使用RSpec过滤器轻松地做到这一点。将上面的代码更改为此-

RSpec.describe "An Example Group with positive and negative Examples" do 
   context 'when testing Ruby\'s build-in math library' do
      
      it 'can do normal numeric operations', positive: true do 
         expect(1 + 1).to eq(2) 
      end 
      
      it 'generates an error when expected', negative: true do 
         expect{1/0}.to raise_error(ZeroDivisionError) 
      end
      
   end 
end

将更改保存到filter_spec.rb并运行此稍有不同的命令-

rspec --tag positive filter_spec.rb

现在,您将看到如下所示的输出-

Run options: include {:positive=>true} 
. 
Finished in 0.001 seconds (files took 0.11401 seconds to load) 
1 example, 0 failures

通过指定–tag positive,我们告诉RSpec仅运行定义了positive的meta变量的Example。我们可以通过运行以下命令对否定测试做同样的事情-

rspec --tag negative filter_spec.rb

请记住,这些只是示例,您可以使用所需的任何名称指定过滤器。

RSpec格式化程序

格式化程序允许RSpec以不同的方式显示测试的输出。让我们创建一个包含此代码的新RSpec文件-

RSpec.describe "A spec file to demonstrate how RSpec Formatters work" do 
   context 'when running some tests' do 
      
      it 'the test usually calls the expect() method at least once' do 
         expect(1 + 1).to eq(2) 
      end
      
   end 
end

现在,将其保存到名为formatter_spec.rb的文件中,然后运行此RSpec命令-

rspec formatter_spec.rb

您应该看到如下所示的输出-

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

现在运行相同的命令,但是这次指定一个格式化程序,如下所示:

rspec --format progress formatter_spec.rb

这次您应该看到相同的输出-

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

原因是“进度”格式化程序是默认格式化程序。接下来让我们尝试其他格式化程序,尝试运行此命令-

rspec --format doc formatter_spec.rb

现在您应该看到此输出-

A spec file to demonstrate how RSpec Formatters work 
   when running some tests 
      the test usually calls the expect() method at least once
Finished in 0.002 seconds (files took 0.11401 seconds to load) 
1 example, 0 failures

如您所见,“ doc”格式化程序的输出完全不同。此格式化程序以类似文档的样式显示输出。您可能想知道测试失败时这些选项的外观(示例)。让我们将formatter_spec.rb中的代码更改如下:

RSpec.describe "A spec file to demonstrate how RSpec Formatters work" do 
   context 'when running some tests' do 
      
      it 'the test usually calls the expect() method at least once' do 
         expect(1 + 1).to eq(1) 
      end
      
   end 
end

eq(1)的期望Expect(1 + 1)。应该失败。保存更改并重新运行以上命令-

rspec –format progress formatter_spec.rb ,请记住,由于默认是“ progress”格式化程序,因此您可以运行: rspec formatter_spec.rb 。您应该看到此输出-

F 
Failures:
1) A spec file to demonstrate how RSpec Formatters work when running some tests 
the test usually calls the expect() method at least once
   Failure/Error: expect(1 + 1).to eq(1)
    
      expected: 1
         got: 2
              
      (compared using ==)              
   # ./formatter_spec.rb:4:in `block (3 levels) in '

Finished in 0.016 seconds (files took 0.11201 seconds to load)
1 example, 1 failure
Failed examples:

rspec ./formatter_spec.rb:3 # A spec file to demonstrate how RSpec 
   Formatters work when running some tests the test usually calls 
   the expect() method at least once

现在,让我们尝试doc格式化程序,运行以下命令-

rspec --format doc formatter_spec.rb

现在,通过失败的测试,您应该看到此输出-

A spec file to demonstrate how RSpec Formatters work
   when running some tests
      the test usually calls the expect() method at least once (FAILED - 1)
        
Failures:

1) A spec file to demonstrate how RSpec Formatters work when running some
   tests the test usually calls the expect() method at least once
   Failure/Error: expect(1 + 1).to eq(1)
    
   expected: 1
        got: 2
          
   (compared using ==)
   # ./formatter_spec.rb:4:in `block (3 levels) in '
    
Finished in 0.015 seconds (files took 0.11401 seconds to load) 
1 example, 1 failure

失败的例子

rspec ./formatter_spec.rb:3#一个说明运行特定测试时RSpec格式化程序如何工作的规范文件,该测试通常至少调用一次Expect()方法。

RSpec格式化程序提供了更改测试结果显示方式的功能,甚至可以创建自己的自定义格式化程序,但这是一个更高级的主题。