Làm cách nào để tôi chỉ chạy thử nghiệm cụ thể trong Rspec?


159

Tôi nghĩ rằng có một cách để chỉ chạy thử nghiệm với một nhãn nhất định. Có ai biết không?

Câu trả lời:


186

Không dễ tìm tài liệu, nhưng bạn có thể gắn thẻ các ví dụ bằng hàm băm. Ví dụ.

# spec/my_spec.rb
describe SomeContext do
  it "won't run this" do
    raise "never reached"
  end

  it "will run this", :focus => true do
    1.should == 1
  end
end

$ rspec --tag focus spec/my_spec.rb

Thêm thông tin về GitHub . (bất cứ ai có liên kết tốt hơn, xin vui lòng tư vấn)

(cập nhật)

RSpec bây giờ là tài liệu tuyệt vời ở đây . Xem phần tùy chọn --tag để biết chi tiết.

Kể từ v2.6, loại thẻ này có thể được thể hiện thậm chí đơn giản hơn bằng cách bao gồm tùy chọn cấu hình treat_symbols_as_metadata_keys_with_true_values, cho phép bạn thực hiện:

describe "Awesome feature", :awesome do

nơi :awesomeđược đối xử như thể nó là :awesome => true.

Đồng thời xem câu trả lời này để biết cách định cấu hình RSpec để tự động chạy các bài kiểm tra 'tập trung'. Điều này đặc biệt tốt với Guard .


Vì vậy, bạn không cần phải tìm kiếm, liên kết trực tiếp đến đề xuất của zetetic có ở đây (đối với Rspec 2.12) relishapp.com/rspec/rspec-core/v/2-12/docs/command-line/,
tir38

Chúng tôi đã thêm một thông số vào bộ phần mềm của mình để đảm bảo mã không bao giờ được hợp nhất với tiêu điểm: đúng vẫn trong kiểm soát nguồn. gist.github.com/jwg2s/7361603
jwg2s

@ jwg2s Tôi sử dụng hook git để chặn các xác nhận :focus, điều này cũng ngăn chặn các điều không mong muốn như 'bind.pry , console.log`, v.v. khỏi leo vào codebase.
zetetic

1
@Otheus không, tôi chỉ là một người hâm mộ :) Tôi thực sự thích những gì họ đã làm trên Relish, nhưng SO chỉ ra mắt tính năng tài liệu riêng của mình, vì vậy chúng tôi có thể thấy một số cạnh tranh.
zetetic

1
Có lẽ bạn có thể chỉ cho tôi cách tài liệu thực sự mô tả cách sử dụng và hành vi thực tế của rspecchương trình :) Bởi vì tài liệu Relish không có.
Otheus


89

Trong của bạn spec_helper.rb:

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

và sau đó về thông số kỹ thuật của bạn:

it 'can do so and so', focus: true do
    # This is the only test that will run
end

Bạn cũng có thể tập trung kiểm tra với 'phù hợp' hoặc loại trừ với 'xit', như vậy:

fit 'can do so and so' do
    # This is the only test that will run
end

1
Trong rspec 3.5, nó config.filter_run_when_matchingcó thể hoạt động chỉ bằng cách thêm :focusvào ví dụ
Ali Ghanavatian

4
Nếu 'tập trung: đúng' là vô tình cam kết, CI của bạn sẽ vượt qua mặc dù không chạy hầu hết các bài kiểm tra.
zach

67

cách khác, bạn có thể chuyển số dòng: rspec spec/my_spec.rb:75- số dòng có thể trỏ đến một thông số kỹ thuật hoặc một khối bối cảnh / mô tả (chạy tất cả các thông số kỹ thuật trong khối đó)


50

Bạn cũng có thể xâu chuỗi nhiều số dòng cùng với dấu hai chấm:

$ rspec ./spec/models/company_spec.rb:81:82:83:103

Đầu ra:

Run options: include {:locations=>{"./spec/models/company_spec.rb"=>[81, 82, 83, 103]}}

Thật là vàng! 🙇🏾♂️
iGbanam

28

Tính đến RSpec 2.4 (tôi đoán), bạn có thể thêm vào trước một fhoặc xđể it, specify, describecontext:

fit 'run only this example' do ... end
xit 'do not run this example' do ... end

http://rdoc.info/github/rspec/rspec-core/RSpec/Core/Examplegroup#fit- class_method http://rdoc.info/github/rspec/rspec-core/RSpec/Core/Examplegroup#xit- class_met

Hãy chắc chắn để có config.filter_run focus: trueconfig.run_all_when_everything_filtered = truetrong của bạn spec_helper.rb.


5

Trong các phiên bản mới hơn của RSpec, việc cấu hình hỗ trợ thậm chí còn dễ dàng hơn fit:

# spec_helper.rb

# PREFERRED
RSpec.configure do |c|
  c.filter_run_when_matching :focus
end

# DEPRECATED
RSpec.configure do |c|
  c.filter_run focus: true
  c.run_all_when_everything_filtered = true
end

Xem:

https://relishapp.com/rspec/rspec-core/docs/filtering/filter-run-when-matching

https://relishapp.com/rspec/rspec-core/v/3-7/docs/configuration/run-all-when-everything-filtered


3

Ngoài ra, bạn có thể chạy thông số kỹ thuật có focus: truemặc định

spec / spec_rcper.rb

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

Sau đó, chỉ cần chạy

$ rspec

và chỉ kiểm tra tập trung sẽ được chạy

sau đó khi bạn loại bỏ focus: truetất cả các bài kiểm tra tốt sẽ được chạy lại

Thêm thông tin: https://www.relishapp.com/rspec/rspec-core/v/2-6/docs/filtering/inclusion-filters


spec/spec_helper.rbluôn luôn bao gồm? Hoặc chỉ khi không có lựa chọn được đưa ra? Tại sao các mô-đun kiểm tra có require 'spec_helber'và không có đoạn mã trên loại bỏ khả năng chạy thử nghiệm đơn lẻ bằng cách chỉ định tệp? Tôi không thể tìm thấy bất kỳ tài liệu về điều này.
Otheus

1
spec_helper.rbluôn được bao gồm nếu bạn có --require spec_helpertrong .rspecroot dự án.
Kris

0

Bạn có thể chạy như rspec spec/models/user_spec.rb -e "SomeContext won't run this".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.