Tắt một nhóm kiểm tra trong rspec?


102

Tôi có một thông số kỹ thuật kiểm tra mà describesmột lớp và trong đó có nhiều lớp khác contextsnhau với các itkhối khác nhau .

Có cách nào để tôi có thể vô hiệu hóa contexttạm thời không?

Tôi đã thử thêm một pending "temporarily disabled"cuộc gọi ở trên cùng trong vòng một contextmà tôi muốn tắt và tôi đã thấy điều gì đó đang chờ xử lý khi tôi chạy thông số kỹ thuật nhưng sau đó nó chỉ tiếp tục chạy phần còn lại của các bài kiểm tra.

Đây là những gì tôi đã có:

describe Something
  context "some tests" do
    it "should blah" do
      true
    end
  end

  context "some other tests" do
    pending "temporarily disabled"

    it "should do something destructive" do
      blah
    end
  end
end

nhưng như tôi đã nói, nó chỉ tiếp tục chạy các bài kiểm tra bên dưới cuộc gọi đang chờ xử lý.

Tìm kiếm đã dẫn tôi đến chuỗi danh sách gửi thư này, trong đó người tạo (?) Của rspec nói rằng nó có thể có trong rspec 2, mà tôi đang chạy. Tôi đoán nó đã hoạt động nhưng nó không có tác dụng mong muốn là vô hiệu hóa tất cả các thử nghiệm sau, đó là những gì tôi nghĩ đến khi tôi thấy một pendingcuộc gọi.

Có một giải pháp thay thế hay tôi đang làm sai?

Câu trả lời:


165

Để tắt một cây thông số kỹ thuật bằng RSpec 3, bạn có thể:

before { skip }
# or 
xdescribe
# or 
xcontext

Bạn có thể thêm một tin nhắn có bỏ qua sẽ hiển thị trong đầu ra:

before { skip("Awaiting a fix in the gem") }

với RSpec 2 :

before { pending }

1
Làm thế nào để bạn biết chính xác làm điều đó trên một khối có:describe 'XXXXX' do .... end
p.matsinopoulos

2
@ p.matsinopoulos Chỉ cần thêm nó vào dòng sau describe 'XXXXX' do. Làm việc như một sự quyến rũ, cảm ơn @Pyro!
chesterbr

Giải pháp đơn giản hơn bộ lọc, 1
dolzenko

Tôi mến bạn. Tôi nợ bạn một chầu bia!
Aldo 'xoen' Giambelluca

2
Cái này đẹp đấy. Bạn cũng có thể bao gồm một thông báo sau 'bỏ qua' sẽ hiển thị trong đầu ra.
Jan Hettich

44

Sử dụng bộ lọc loại trừ . Từ trang đó: Trong spec_helper.rb(hoặc rails_helper.rb) của bạn

RSpec.configure do |c|
  c.filter_run_excluding :broken => true
end

Trong thử nghiệm của bạn:

describe "group 1", :broken => true do
  it "group 1 example 1" do
  end

  it "group 1 example 2" do
  end
end

describe "group 2" do
  it "group 2 example 1" do
  end
end

Khi tôi chạy "rspec ./spec/sample_spec.rb --format doc"

Sau đó, đầu ra phải chứa "nhóm 2 ví dụ 1"

Và đầu ra không được chứa "nhóm 1 ví dụ 1"

Và đầu ra không được chứa "nhóm 1 ví dụ 2"


19

Hãy xem bạn nghĩ gì về điều này:

describe "something sweet", pending: "Refactor the wazjub for easier frobbing" do
  it "does something well"
  it "rejects invalid input"
end

Tôi muốn xem lý do với các mục đang chờ xử lý của mình khi tôi tắt một thứ gì đó trong "một lúc". Chúng đóng vai trò là những nhận xét / VIỆC CẦN LÀM ít được trình bày thường xuyên thay vì bị chôn vùi trong một nhận xét hoặc một ví dụ / tệp bị loại trừ.

Thay đổi itthành pendinghoặc xitnhanh chóng và dễ dàng, nhưng tôi thích xây dựng băm hơn. Nó cung cấp cho bạn tài liệu chạy mọi lúc, là một trình đơn thả vào (không thay đổi mô tả / ngữ cảnh / nó, vì vậy tôi phải quyết định sử dụng lại cái gì sau này) và cũng dễ dàng bị loại bỏ nếu quyết định được đưa ra hoặc trình chặn được gỡ bỏ .

Điều này hoạt động tương tự cho các nhóm và ví dụ cá nhân.


Ngoài ra, tôi không chắc liệu nó có hoạt động giống như mô tả hay không nhưng trong thời gian chờ xử lý thực sự chạy thử nghiệm và không thành công nếu thử nghiệm bắt đầu vượt qua. Xdescribe (tôi đoán giống như xit) - chỉ là không chạy nó.
PL J

1
xác nhận rằng điều này hoạt động, với cả pending:skip:, trong rspec 3.6.0. Có vẻ như là giải pháp tốt nhất cho tôi. trong rspec3 đang chờ xử lý vẫn chạy thử nghiệm, nhưng skipkhông chạy (tuy nhiên bạn áp dụng skip).
jrochkind

9

một cái khác. https://gist.github.com/1300152

sử dụng xdescribe, xcontext, xit để vô hiệu hóa nó.

Cập nhật:

Kể từ rspec 2.11, nó bao gồm xit theo mặc định. vì vậy mã mới sẽ là

# put into spec_helper.rb
module RSpec
  module Core
    module DSL
      def xdescribe(*args, &blk)
        describe *args do
          pending 
        end
      end

      alias xcontext xdescribe
    end
  end
end

Sử dụng

# a_spec.rb
xdescribe "padding" do
  it "returns true" do
    1.should == 1
   end
end 

3

Sử dụng đang chờ xử lý thay vì mô tả. Nếu khối của bạn là:

context "some other tests" do
  it "should do something destructive" do
    blah
  end
end

Bạn có thể bỏ qua toàn bộ khối bằng cách:

pending "some other tests" do
  it "should do something destructive" do
    blah
  end
end

1
describe "GET /blah" do

  before(:each) { pending "Feature to be implemented..." }

  it { expect(page).to have_button("Submit") }
  it { expect(page).to have_content("Blah") }
end

0

Chỉ để giải thích những gì đang xảy ra với mã của bạn. Bao gồm nó ở nơi bạn có, nó chỉ được đánh giá (và do đó chạy) khi tệp được tải trong khi khởi động. Tuy nhiên, bạn cần nó được chạy khi chạy thử nghiệm. Đó là lý do tại sao các câu trả lời đã đề xuất đặt pending(RSpec 2) hoặc skip(RSpec 3) vào một beforekhối.

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.