rspec如何运行单个testing?
我已经在网上find各种链接,但没有一个是最新的,并显示如何运行一个单一的testing。
我有以下文件:
/spec/controllers/groups_controller_spec.rb
我使用哪个terminal命令来运行该规范,以及在哪个命令中运行命令?
我的gem文件:
# 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
spec文件
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
通常我做:
rspec ./spec/controllers/groups_controller_spec.rb:42
其中42
代表我想运行的testing线。
EDIT1:
你也可以使用标签。 看到这里 。
编辑2:
尝试:
bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42
用耙子:
rake spec SPEC=path/to/spec.rb
(信贷去这个答案 ,去投票给他)
编辑 (感谢@ cirosantilli):要在规范内运行一个特定的场景,你必须提供匹配描述的正则expression式匹配。
rake spec SPEC=path/to/spec.rb \ SPEC_OPTS="-e \"should be successful and return 3 items\""
您可以将一个正则expression式传递给spec命令,它只会运行与您提供的名称匹配的块。
spec path/to/my_spec.rb -e "should be the correct answer"
我运行特定testing的首选方法稍有不同 – 我添加了行
RSpec.configure do |config| config.filter_run :focus => true config.run_all_when_everything_filtered = true end
到我的spec_helper文件。
现在,每当我想运行一个特定的testing(或上下文,或规范),我可以简单地添加标签“焦点”,并正常运行我的testing – 只有重点testing(S)将运行。 如果我删除了所有的焦点标签,那么run_all_when_everything_filtered
正常运行,并运行所有的testing。
这不像命令行选项那么简单快捷 – 它要求您编辑要运行的testing的文件。 但是,我觉得它给了你更多的控制。
有很多select:
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
@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:[1:1]
或者rspec spec/unit/baseball_spec.rb:[1:1:1]
( rspec spec/unit/baseball_spec.rb:42
(42行testing) rspec spec/unit/baseball_spec.rb:[1:1:1]
取决于testing用例是如何嵌套的。
从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
在导轨5中,
我用这种方式运行单个testing文件(所有的testing在一个文件中)
rails test -n /TopicsControllerTest/ -v
类名可以用来匹配所需文件TopicsControllerTest
我的课程class TopicsControllerTest < ActionDispatch::IntegrationTest
输出:
如果你想你可以调整正则expression式来匹配单个testing方法\TopicsControllerTest#test_Should_delete\
rails test -n /TopicsControllerTest#test_Should_delete/ -v
对于模型,它只会在第5行上运行
bundle exec rspec spec/models/user_spec.rb:5
对于控制器:它只会在第5行上运行
bundle exec rspec spec/controllers/users_controller_spec.rb:5
对于信号模型或控制器,从上面删除行号
在所有型号上运行案例
bundle exec rspec spec/models
在所有控制器上运行案例
bundle exec rspec spec/controllers
运行所有情况
bundle exec rspec
鉴于你在rspec 2的rails 3项目,从rails根目录:
bundle exec rspec spec/controllers/groups_controller_spec.rb
应该肯定工作。 我厌倦了打字,所以我创build了一个别名来缩短'bundle exec rspec'到'bersp'
'bundle exec'是这样的:它加载了你的gem文件中指定的确切的gem环境: http : //gembundler.com/
Rspec2从“spec”命令切换到“rspec”命令。
我使用这个守护gem来自动运行我的testing。 它在testing文件上创build或更新操作后执行testing。
https://github.com/guard/guard-test
或者通常可以使用以下命令运行
rspec spec / controllers / groups_controller_spec.rb
你可以做这样的事情:
rspec/spec/features/controller/spec_file_name.rb rspec/spec/features/controller_name.rb #run all the specs in this controller
有一个gem“ 看守 ”,它可以跟踪文件中的任何代码更改,并自动运行testing