如何运行单个RSpec测试?


306

我有以下文件:

/spec/controllers/groups_controller_spec.rb

我要在终端中使用哪个命令来仅运行该规范,并在哪个目录中运行该命令?

我的宝石文件:

# Test ENVIRONMENT GEMS
group :development, :test do
    gem "autotest"
    gem "rspec-rails", "~> 2.4"
    gem "cucumber-rails", ">=0.3.2"
    gem "webrat", ">=0.7.2"
    gem 'factory_girl_rails'
    gem 'email_spec'
end

规格文件:

require 'spec_helper'

describe GroupsController do
  include Devise::TestHelpers

  describe "GET yourgroups" do
    it "should be successful and return 3 items" do

      Rails.logger.info 'HAIL MARRY'

      get :yourgroups, :format => :json
      response.should be_success
      body = JSON.parse(response.body)
      body.should have(3).items # @user1 has 3 permissions to 3 groups
    end
  end
end

您可以运行您的测试,例如bundle exec rspec ./spec/controllers/groups_controller_spec.rb:6,它仅运行此特定测试。此处了解
Nesha Zoric '18

bundle exec rspec spec --help威尔给你答案:
托马斯·德考

Answers:


15

不确定有多少时间可用,但是有Rspec配置用于运行过滤-因此现在您可以将其添加到您的spec_helper.rb

RSpec.configure do |config|
  config.filter_run_when_matching :focus
end

然后将焦点标签添加到itcontextdescribe仅运行该代码块:

it 'runs a test', :focus do
  ...test code
end

RSpec文档:

https://www.rubydoc.info/github/rspec/rspec-core/RSpec/Core/Configuration#filter_run_when_matching-instance_method


1
这需要更改基础架构。并记得将其改回。我建议不要这样做,而只使用rspec命令运行带有适当参数的规范来指明哪个
Michael Durrant

482

通常我会:

rspec ./spec/controllers/groups_controller_spec.rb:42

其中42代表我要运行的测试行。

编辑1:

您也可以使用标签。看这里

编辑2:

尝试:

bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42

谢谢尝试,当我做rape spec /spec/path...:XX时,我收到错误/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -S bundle exec rspec ./spec/controllers/groups_controller_spec.rb ./spec/controllers/incoming_mails_controller_spec.rb ./spec/lib/mailing_job/mailingjob_find_reply_spec.rb ./spec/models/group_model_spec.rb ./spec/models/user_model_spec.rb
AnApprentice

如果我尝试仅使用RSPEC,则会出现以下错误:“ $ rspec spec / controllers / groups_controller_spec.rb:19 /Library/Ruby/Gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:27 :in`setup':您已经激活了rspec-core 2.6.2,但是您的Gemfile需要使用rspec-core 2.6.0。考虑使用bundle exec。(Gem :: LoadError)“
AnApprentice

在这种情况下,您可以尝试“ bundle exec rspec spec / controllers / groups_controller_spec.rb:19”
muffinista 2011年

Bundle exec工作了,但是为什么呢?难道有什么办法可以避免这种情况吗?
2011年

11
这不是黑客,它可以确保您使用与gemfile中声明的版本完全相同的版本。在您的情况下,仅rspec失败是因为系统上的版本比gemfile中的版本更新。
2011年

67

与耙:

rake spec SPEC=path/to/spec.rb

(信用去这个答案。去投票给他。)

编辑(由于@cirosantilli):要在规范中运行一个特定方案,您必须提供与描述匹配的正则表达式模式匹配。

rake spec SPEC=path/to/spec.rb \
          SPEC_OPTS="-e \"should be successful and return 3 items\""

11
这是更好的答案,因为它使用“ rake spec”命令而不是“ rspec”命令。这意味着每次都会正确重新初始化测试数据库(如果使用'rspec ...'则不会发生)
jpw 2012年

您可以用来SPEC=path/to/spec.rb:42在给定的行号上运行测试,尽管看起来任何it_behaves_like测试也可以运行(错误?)。
mgold 2015年

61

您可以将正则表达式传递给spec命令,该命令仅运行it与您提供的名称匹配的块。

spec path/to/my_spec.rb -e "should be the correct answer"

2019更新:Rspec2从'spec'命令切换到'rspec'命令。


谢谢,我试过了,但是出错了:$ rake spec spec / controllers / incoming_mails_controller_spec.rb -e“应该成功并返回3个项目” rake中止了!(eval):1:在“ standard_rake_options”中:编译错误(eval):1:语法错误,意外的tIDENTIFIER,期望$ end应该成功并返回3个项目
AnApprentice

更新了实际规格文件的想法?
2011年

如果出现编译错误,则说明您的规范不是有效的ruby。确保你不会错过do一后itcontextdescribe声明。
道格拉斯·希勒

1
这是“规格”,而不是“耙规格”。
muffinista

这应该是正确的答案,与行号是严重的错误-任何任何情况下
尤金·迈耶

27

有很多选择:

rspec spec                           # All specs
rspec spec/models                    # All specs in the models directory
rspec spec/models/a_model_spec.rb    # All specs in the some_model model spec
rspec spec/models/a_model_spec.rb:nn # Run the spec that includes line 'nn'
rspec -e"text from a test"           # Runs specs that match the text
rspec spec --tag focus               # Runs specs that have :focus => true
rspec spec --tag focus:special       # Run specs that have :focus => special
rspec spec --tag focus ~skip         # Run tests except those with :focus => true

23

我运行特定测试的首选方法略有不同-我添加了以下几行

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

到我的spec_helper文件。

现在,只要我想运行一个特定的测试(或上下文或规范),我都可以简单地将标记“ focus”添加到其中,然后正常运行我的测试-仅运行集中测试。如果删除所有焦点标签,run_all_when_everything_filtered则会正常启动并运行所有测试。

它不如命令行选项那么快速和容易-它确实需要您编辑要运行的测试的文件。我感觉,但是它给了您更多的控制权。


我绝对喜欢这种风格,因为我通常通过Rubymine / intelliJ运行测试。我也喜欢这种方法,因为它类似于在茉莉花中使用fit / xit /含漱口水
有线00

9

@apneadiving答案是解决此问题的一种好方法。但是,现在Rspec 3.3中有了新方法。我们可以简单地运行rspec spec/unit/baseball_spec.rb[#context:#it]而不使用行号。从这里拍摄

RSpec 3.3引入了一种识别示例的新方法[...]

例如,此命令:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4] …将运行在spec / unit / baseball_spec.rb中定义的第一顶级组下定义的第二和第四示例或组。

因此rspec spec/unit/baseball_spec.rb:42,除了做 第一个测试所在的地方(第42行中的测试)之外,我们可以简单地进行操作 rspec spec/unit/baseball_spec.rb[1:1]rspec spec/unit/baseball_spec.rb[1:1:1]取决于测试用例的嵌套方式。


5

在导轨5中

我使用这种方式来运行单个测试文件(所有测试都在一个文件中)

rails test -n /TopicsControllerTest/ -v

类名可用于匹配所需的文件 TopicsControllerTest

我的课 class TopicsControllerTest < ActionDispatch::IntegrationTest

输出:

在此处输入图片说明

如果您愿意,可以调整正则表达式以匹配单个测试方法 \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v

4

对于模型,它将仅在第5行运行case

bundle exec rspec spec/models/user_spec.rb:5

对于控制器:仅在第5行运行case

bundle exec rspec spec/controllers/users_controller_spec.rb:5

对于信号模型或控制器,从上方移开行号

在所有型号上运行案例

bundle exec rspec spec/models

在所有控制器上运行案例

bundle exec rspec spec/controllers

运行所有案例

 bundle exec rspec 

3

从项目的根目录运行命令:

# run all specs in the project's spec folder
bundle exec rspec 

# run specs nested under a directory, like controllers
bundle exec rspec spec/controllers

# run a single test file
bundle exec rspec spec/controllers/groups_controller_spec.rb

# run a test or subset of tests within a file
# e.g., if the 'it', 'describe', or 'context' block you wish to test
# starts at line 45, run:
bundle exec rspec spec/controllers/groups_controller_spec.rb:45

1

从rspec 2开始,您可以使用以下命令:

# in spec/spec_helper.rb
RSpec.configure do |config|
  config.filter_run :focus => true
  config.run_all_when_everything_filtered = true
end

# in spec/any_spec.rb
describe "something" do
  it "does something", :focus => true do
    # ....
  end
end

0

假设您在带有rspec 2的rails 3项目中,则从rails根目录:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

应该肯定可以工作。我已经厌倦了键入,所以我创建了一个别名来将“ bundle exec rspec”缩短为“ bersp”

'bundle exec'是这样,它可以加载您的gem文件中指定的确切gem环境:http : //gembundler.com/

Rspec2从“ spec”命令切换到“ rspec”命令。



0

您可以执行以下操作:

 rspec/spec/features/controller/spec_file_name.rb
 rspec/spec/features/controller_name.rb         #run all the specs in this controller

0

您可以使用

 rspec spec/controllers/groups_controller_spec.rb:<line_number>

行号应该是'describe'或'it'行的行号,以便它将运行该特定块中存在的测试。相反,它将执行line_number旁边的所有行。

您也可以使用自定义名称创建块,然后只能执行这些块。


0

另一个常见的错误是仍然将旧版的Rails应用程序升级或升级到Rails 5+,并将其放在require 'spec_helper'每个测试文件的顶部。应更改为require 'rails_helper'。如果在rake任务(rake spec)和运行单个spec(rspec path/to/spec.rb)之间看到不同的行为,这是常见的原因

最好的解决方案是

1)确保您使用require 'rails_helper'的是每个规范文件的顶部,而不是较旧的样式require 'spec_helper' 2)使用rake spec SPEC=path/to/spec.rb语法

rspec path/to/spec.rb我认为较老的样式应该在2020年的这个时候被社区认为是过时的(但是当然,除了其他考虑之外,您还可以使用它)

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.