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


282

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

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

./Rakefile
./lib
./lib/cushion.rb
./lib/缓冲
./lib/cushion/doc.rb
./lib/cushion/db.rb
./规格
./spec/spec.opts
./spec/spec_helper.rb
./spec/db_spec.rb

Answers:


392

或者,您可以跳过rake并使用'rspec'命令:

rspec path/to/spec/file.rb

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

如果您使用的是旧版的rspec,则为:

spec path/to/spec/file.rb

31
对于新的rspec,您必须使用“ rspec path / to / file.rb”
djburdick 2010年

3
也许我做错了,但是我必须做“ bundle exec rspec path / to / spec / file.rb”
andrhamm 2013年

2
如果您使用的是Rails,则可能要使用Rake执行规范,以确保您从空白数据库开始。
superluminary 2013年

@andrhamm,您只是在捆绑包的上下文中运行规范。如果您不使用gemset(这是rvm默认提供的,并且是rbenv的单独扩展),则这是必要的
Caleb

6
如果只想运行一个测试,则将测试开始的行号附加到文件中。示例:rspec path / to / spec / file.rb:455
runamok

201

原始调用:

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

现在找出如何将此嵌入到编辑器中。


1
就像我说的那样,我不会陷入困境,所以没有控制器。但是可以,“ rake spec SPEC = file.rb”有效。谢谢!我现在正在进行Emacs集成。
乔纳森·陈

5
如果可以避免,请勿启动rakefile。这需要frickin年龄
猎户座爱德华兹

2
我更改了接受的答案,但是SPEC_OPTS参数也对我有所帮助。
乔纳森·陈

2
现在,这就是我所说的一个很好的答案。为什么没有将其标记为“答案”?
gmile

1
直接运行spec 通常是最好的选择,但是在很多情况下,您必须在自定义Rakefile中运行各种魔术位的rake
Nerdmaster 2012年

124

这个问题是一个古老的问题,但在搜索如何运行单个测试时会显示在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主文件一起使用,但是如果其中没有示例,它将无法运行同样,如果您尝试将其用于不是顶级规范文件的文件,那么该文件也将一无所获。)
Trejkaz,

我不太明白。您所说的“顶级规格文件”是什么意思?我的测试套件几乎总是分布在多个文件中,而且我总是可以使用此方法在单个文件中调用测试。您是说拥有require其他规格文件的文件吗?
juanpaco

我可以在spec /目录下任何级别的任何文件上使用它。我相信Trejkaz是不正确的。
Michael Durrant 2014年

7
这太棒了,应该放在最上面!
Tommaso Barbugli 2014年

4
我一直在使用它,但是有时您想从一个文件运行多个测试。然后,您可以键入以下所有示例:rspec spec/models/foo_spec.rb:2:12:49
swilgosz

61

您还可以将* 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'

这里不需要耙。


这就是您所需要的,除了@bandhunt所述应将“ spec”替换为“ rspec”
Nicolas Wormser

19

来自帮助(规格-h):

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

示例:spec spec / runner_spec.rb -l 162


3
在较新的Rspec版本中:,根据文档和流行的答案,在冒号后附加行号。
dragon788

13

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

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

例如:

ruby myclass_spec.rb

2
是否可以像这样在文件中运行一项测试?
伊恩·沃恩

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

看来该宝石没有得到维护,上一次提交是5年前!
thegreendroid

10

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

  红宝石-我规格spec / models / user_spec.rb

说明:

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

您可以使用一些其他选项在该文件中运行一项测试吗?
伊恩·沃恩

10

要运行所有 rspec文件:rspec

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

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

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

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

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


5

我在使这些示例中的任何一个工作时遇到了麻烦,也许是因为帖子过时并且命令已更改?

经过一番戳后,我发现这可行:

rspec规格/型号/user_spec.rb

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


在接受的答案的评论中提到了这一点。是的,我认为这篇文章太旧了,命令名称已更改。
Jonathan Tran

4

斑点病毒


3

另外,看看自动测试。

在命令窗口中运行自动测试意味着您保存该规范文件时将执行该文件。另外,只要运行您要指定的文件,它就会运行。

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


3

尽管对此问题有很多出色的答案,但是没有一个使用Rspectags方法。

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

例如,我将标签“ 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

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


2

可以说,您正在测试创建待办事项。您始终可以使用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 

如果要在特定的控制器用户中运行所有规格,请执行此操作。

  rspec/spec/feaures/controller_name

  Example:   rspec/spec/features/todos

希望它能给您更多的理解!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.