如何在 rspec 中运行单个测试?

Posted

技术标签:

【中文标题】如何在 rspec 中运行单个测试?【英文标题】:How to run a single test in guard for rspec? 【发布时间】:2014-02-03 07:53:15 【问题描述】:

我使用guard-rspec 在我的文件更改时自动运行必要的 rspec 测试,我喜欢它的工作原理。然而,当我调试一个包含多个测试的文件时,有时我只想重新运行一个单独的测试。例如,使用命令行中的 rspec:

rspec spec/requests/my_favorite_spec.rb:100

这将只运行my_favorite_spec.rb 中第 100 行的单个规范。

我尝试将上述内容输入到守卫控制台,但它只是运行了所有测试,就好像我刚刚按下了回车键一样。守卫控制台中是否有另一种语法来运行单个规范?

【问题讨论】:

【参考方案1】:

我认为您可以为要运行的规范添加“focus: true”选项,例如

it 'does something', focus: true do
  //your spec
end

然后你保存文件,然后守卫只运行那个专注的测试

完成后,您只需删除“focus: true”

【讨论】:

【参考方案2】:

您必须为您的spec/spec_helper.rb 文件提供参数以接受:focus => true 声明。

RSpec.configure do |config|
  config.filter_run :focus => true
end

然后就可以使用了

it 'does something', :focus => true do
  //your spec
end

describe "something", :focus => true do
  before do
     sign in
     visit page
  end

  it  does something 
  it  does something else 
end

如果您打算采用这种方法,您可能还想确保在任何地方都没有:focus => true 时运行所有规范,使用documented approach:

RSpec.configure do |config|
  config.run_all_when_everything_filtered = true
end

您可以使用过滤器做很多事情;你可能想看看这个页面:https://relishapp.com/rspec/rspec-core/v/3-0/docs/filtering

【讨论】:

这正是我所需要的,而且链接也很有帮助。谢谢! 这行得通,但是当我从it 块中删除:focus => true 时,guardAll examples were filtered out。显然这不能满足明显的工作流程。如果不存在 :focus 子句,则完整的解决方案将运行所有示例。 好的,当没有:focus 子句时,您可以运行所有规范,通过config.run_all_when_everything_filtered = true 块中的config.run_all_when_everything_filtered = true。这里是the docs。 有没有办法从命令行做到这一点?我正在尝试使命令行功能同时适用于警卫和并行规范【参考方案3】:

您可以在 Guardfile 中使用 failed_mode: :focus,如下所述:https://github.com/guard/guard-rspec#list-of-available-options

【讨论】:

以上是关于如何在 rspec 中运行单个测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 rspec 在没有挂起测试输出的情况下运行?

在 Rails 的 rspec 中,我如何编写/编辑我的测试文件,以便特定上下文中的示例以设定的顺序运行?

Rspec 如何测试 Sidekiq 作业是不是计划在特定时间运行

RSpec:如何获得`c.filter_run_excluding`排除的测试数量?

如何在不运行 rake spec 的情况下为 Rails rspec 测试准备测试数据库?

如何在rspec测试中跳过服务调用