如何在 RSpec 中运行单个测试/规范文件?

Posted

技术标签:

【中文标题】如何在 RSpec 中运行单个测试/规范文件?【英文标题】:How do you run a single test/spec file in RSpec? 【发布时间】:2010-09-13 17:20:25 【问题描述】:

我希望能够运行单个规范文件的测试——例如,对于我正在编辑的一个文件。 rake spec 执行所有规范。我的项目不是 Rails 项目,所以rake spec:doc 不起作用。

不知道这是否重要,但这是我的目录结构。

./耙文件 ./lib ./lib/cushion.rb ./lib/靠垫 ./lib/cushion/doc.rb ./lib/靠垫/db.rb ./规格 ./spec/spec.opts ./spec/spec_helper.rb ./spec/db_spec.rb

【问题讨论】:

【参考方案1】:

您可以在测试文件中运行特定的行

rspec spec/models/model_spec.rb:47

【讨论】:

差不多 10 年前提供了同样的答案。【参考方案2】:

要运行 所有 rspec 文件:rspec

注意:您必须在项目的根目录中

运行一个 rspec文件:rspec 'path_to/spec.rb'

注意:将 'path_to/spec.rb' 替换为您的路径。引号可选。

要从一个文件运行 one rspec testrspec 'path_to/spec.rb:7'

注意::7 是测试开始的行号

【讨论】:

【参考方案3】:

尽管针对这个问题写了很多很好的答案,但没有一个使用Rspec tags 方法。

我使用标签在不同的文件中运行一个或多个规范——仅与我当前的开发任务相关的那些。

例如,我添加标签“dev”,其值为“current”:

it "creates an user", dev: :current do
  user = create(:user)
  expect(user.persisted?).to be_truthy
end

然后我跑

bundle exec rspec . --tag dev:current

可以在单个规范或组中设置不同的标签/值。

【讨论】:

【参考方案4】:

假设您正在运行测试以创建待办事项。您始终可以使用文件 crete_spec.rb 文件运行特定的待办事项规范代码,如下所示。

      rspec/spec/features/controller/spec_file_name.rb

   Example:

   Creating  rspec spec/features/todos/create_spec.rb
   Editing   rspec spec/features/todos/edit_spec.rb
   Deleting  rspec spec/features/todos/destroy_spec.rb

如果您想一次性运行所有规范。

   rspec 

如果您想在特定控制器用户中运行所有规范,请使用 this。

  rspec/spec/feaures/controller_name

  Example:   rspec/spec/features/todos

希望能给你更多的理解!

【讨论】:

【参考方案5】:

您还可以将 *e*xample 测试用例的实际文本与 -e 一起使用!

所以对于:

it "shows the plane arrival time"

你可以使用

rspec path/to/spec/file.rb -e 'shows the plane arrival time'
./scripts/spec path/to/spec/file.rb -e 'shows the plane arrival time'

这里不需要耙子。

【讨论】:

这就是你所需要的,除了“spec”应该替换为“rspec”,如@bandhunt所述【参考方案6】:

这个问题很老了,但在搜索如何运行单个测试时,它会显示在 Google 的顶部。我不知道这是否是最近添加的,但要根据规范运行单个测试,您可以执行以下操作:

rspec path/to/spec:<line number>

其中 -line number- 是包含部分测试的行号。例如,如果您有这样的规范:

1: 
2: it "should be awesome" do
3:   foo = 3
4:   foo.should eq(3)
5: end
6:

假设它保存在 spec/models/foo_spec.rb 中。然后你会运行:

rspec spec/models/foo_spec.rb:2

它只会运行那个规范。事实上,这个数字可以是 2 到 5 之间的任何值。

希望这会有所帮助!

【讨论】:

这很有趣,尽管一旦你将规范重构为多个文件,它看起来就不起作用(即你只能将它与主 _spec.rb 文件一起使用,但如果你的示例都没有在其中,它不会运行任何东西。此外,如果您尝试将它用于不是***规范文件的文件,那也不会运行任何东西。) 我不太明白。 “***规范文件”是什么意思?我的测试套件几乎总是分成几个文件,我总是可以使用这种方法在单个文件中调用测试。你的意思是有一个requires 你的其他规范文件的文件? 我可以在 spec/ 目录下的任何级别的任何文件上使用它。我认为 Trejkaz 是不正确的。 这太棒了,应该放在首位! 我一直使用它,但有时您想从一个文件运行多个测试。然后你可以像这样输入所有例子:rspec spec/models/foo_spec.rb:2:12:49【参考方案7】:

或者您可以跳过 rake 并使用“rspec”命令:

rspec path/to/spec/file.rb

在您的情况下,我认为只要您的 ./spec/db_spec.rb 文件包含适当的帮助程序,它就可以正常工作。

如果您使用的是旧版本的 rspec,它是:

spec path/to/spec/file.rb

【讨论】:

对于新的 rspec,您必须使用“rspec path/to/file.rb” 也许我做错了,但我必须做“bundle exec rspec path/to/spec/file.rb” 如果您使用的是 Rails,您可能希望使用 Rake 执行您的规范,以确保您从空白数据库开始。 @andrhamm,您只是在捆绑包的上下文中运行您的规范。如果您不使用 gemsets(默认情况下与 rvm 一起提供,并且是 rbenv 的单独扩展),这是必要的 如果您只想运行一个测试,请将测试开始的行号附加到文件中。示例:rspec path/to/spec/file.rb:455【参考方案8】:

原始调用:

耙规格 SPEC=spec/controllers/sessions_controller_spec.rb \ SPEC_OPTS="-e \"应该使用cookie登录\""

现在弄清楚如何将它嵌入到您的编辑器中。

【讨论】:

正如我所说,我不在 Rails 中,所以没有控制器。但是,是的,“rake spec SPEC=file.rb”有效。谢谢!我现在正在处理 Emacs 集成。 如果可以避免,请不要启动 rakefile。这需要很长时间 我更改了接受的答案,但 SPEC_OPTS 参数对我也有帮助。 现在这就是我所说的好答案。为什么没有标记为“答案”? 直接运行规范通常是最好的选择,但是很多时候你必须为自定义 Rakefile 中的各种魔法位运行 rake【参考方案9】:

Ruby 1.9.2 和 Rails 3 有一种简单的方法来运行一个规范文件:

ruby -I 规范规范/模型/user_spec.rb

解释:

ruby 命令往往比 rake 命令快 -I spec 表示“在查找文件时包含‘spec’目录” spec/models/user_spec.rb 是我们要运行的文件。

【讨论】:

您可以在该文件中运行一个测试并使用一些额外的选项吗?【参考方案10】:

我无法让这些示例中的任何一个工作,可能是因为帖子太旧并且命令已更改?

经过一番摸索,我发现这是可行的:

rspec 规范/模型/user_spec.rb

这将只运行单个文件并在终端中提供有用的输出。

【讨论】:

在接受的答案中的评论中提到了这一点。是的,我认为这篇文章太老了,命令名称已经改变了。【参考方案11】:

来自帮助(规范 -h):

-l, --line LINE_NUMBER           Execute example group or example at given line.
                                 (does not work for dynamically generated examples)

示例:spec/runner_spec.rb -l 162

【讨论】:

在较新的 Rspec 版本中,您根据文档和流行的答案在冒号 : 后附加行号。【参考方案12】:

http://github.com/grosser/single_test 可以让你做类似的事情......

rake spec:user          #run spec/model/user_spec.rb (searches for user*_spec.rb)
rake test:users_c       #run test/functional/users_controller_test.rb
rake spec:user:token    #run the first spec in user_spec.rb that matches /token/
rake test:user:token    #run all tests in user_test.rb that match /token/
rake test:last
rake spec:last

【讨论】:

看来gem没维护,上次commit是5年前!【参考方案13】:

specky.vim

【讨论】:

【参考方案14】:

或者,看看自动测试。

在命令窗口中运行自动测试意味着无论何时保存规范文件都会执行它。此外,它会在您指定的文件运行时运行。

例如,如果您有一个名为 person_spec.rb 的模型规范文件和一个名为 person.rb 的模型文件,那么无论何时您从编辑器中保存这些文件中的任何一个,都会执行该规范文件。

【讨论】:

【参考方案15】:

如果您将 rspec 作为插件而不是作为 gem 安装,那么您将没有 spec 可执行文件。

无论如何,您需要做的就是使用 ruby​​ 运行该文件。 rspec 代码足够聪明,可以为您运行测试。

例如:

ruby myclass_spec.rb

【讨论】:

是否可以像这样在文件中运行一项测试?

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

如何在RSpec中使用终端的单一命令运行多个规格文件?

如何在 Capybara 和 RSpec 中测试 CSV 文件下载?

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

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

RSpec:如何测试 Rails 记录器消息期望?

如何显示 RSpec 测试生成的 SQL 查询日志?