ปิดใช้งานกลุ่มการทดสอบใน rspec หรือไม่


104

ฉันมีข้อมูลจำเพาะการทดสอบซึ่งdescribesคลาสและภายในนั้นมีหลากหลายcontextsแต่ละitบล็อกที่แตกต่างกัน

มีวิธีปิดการใช้งานcontextชั่วคราวหรือไม่?

ฉันลองเพิ่มการpending "temporarily disabled"โทรที่ด้านบนสุดภายในcontextฉันต้องการปิดใช้งานและฉันเห็นบางอย่างเกี่ยวกับการรอดำเนินการเมื่อฉันเรียกใช้ข้อมูลจำเพาะ แต่จากนั้นก็ยังคงเรียกใช้การทดสอบที่เหลือต่อไป

นี่คือสิ่งที่ฉันมี:

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

แต่อย่างที่ฉันบอกว่ามันแค่ทำการทดสอบต่อไปภายใต้การโทรที่รอดำเนินการ

การค้นหาทำให้ฉันไปยังเธรดรายชื่ออีเมลนี้ซึ่งผู้สร้าง (?) ของ rspec บอกว่าเป็นไปได้ใน rspec 2 ซึ่งฉันกำลังใช้งานอยู่ ฉันเดาว่ามันใช้งานได้ แต่ไม่มีผลตามที่ต้องการในการปิดใช้งานการทดสอบทั้งหมดต่อไปนี้ซึ่งเป็นสิ่งที่ฉันคิดเมื่อฉันเห็นการpendingโทร

มีทางเลือกอื่นหรือว่าฉันทำผิด?

คำตอบ:


167

หากต้องการปิดใช้งานโครงสร้างรายละเอียดโดยใช้RSpec 3คุณสามารถ:

before { skip }
# or 
xdescribe
# or 
xcontext

คุณสามารถเพิ่มข้อความด้วยการข้ามที่จะปรากฏในผลลัพธ์:

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

ด้วยRSpec 2 :

before { pending }

1
คุณทำได้อย่างไรในบล็อกที่มี:describe 'XXXXX' do .... end
matsinopoulos

2
@ p.matsinopoulos describe 'XXXXX' doเพียงแค่เพิ่มไปยังบรรทัดต่อไปนี้ ทำงานอย่างมีเสน่ห์ขอบคุณ @Pyro!
chesterbr

วิธีแก้ปัญหาที่ง่ายกว่าตัวกรอง +1
dolzenko

ผมรักคุณ. ฉันเป็นหนี้คุณเบียร์!
Aldo 'xoen' Giambelluca

2
นี่เป็นสิ่งที่ดี คุณยังสามารถใส่ข้อความหลัง "ข้าม" ที่จะแสดงในผลลัพธ์ได้
Jan Hettich

44

ใช้ฟิลเตอร์ยกเว้น จากหน้านั้น: ในspec_helper.rb(หรือrails_helper.rb) ของคุณ

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

ในการทดสอบของคุณ:

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

เมื่อฉันเรียกใช้ "rspec ./spec/sample_spec.rb --format doc"

จากนั้นผลลัพธ์ควรมี "กลุ่ม 2 ตัวอย่าง 1"

และเอาต์พุตไม่ควรมี "กลุ่ม 1 ตัวอย่าง 1"

และเอาต์พุตไม่ควรมี "กลุ่ม 1 ตัวอย่าง 2"


19

ดูว่าคุณคิดอย่างไรกับสิ่งนี้:

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

ฉันชอบดูเหตุผลกับรายการที่รอดำเนินการเมื่อฉันปิดใช้งานบางอย่างเป็นเวลา "ชั่วขณะ" เป็นข้อคิดเห็นเล็ก ๆ น้อย ๆ / สิ่งที่ต้องทำที่นำเสนอเป็นประจำแทนที่จะฝังอยู่ในความคิดเห็นหรือตัวอย่าง / ไฟล์ที่ยกเว้น

เปลี่ยนitเป็นpendingหรือxitเป็นเรื่องง่ายและรวดเร็ว แต่ฉันชอบการก่อสร้างกัญชา มันให้เอกสารทุกการรันเป็นดรอปอิน (ไม่เปลี่ยนคำอธิบาย / บริบท / ดังนั้นฉันต้องตัดสินใจว่าจะใช้อะไรอีกในภายหลัง) และจะถูกลบออกอย่างง่ายดายเช่นเดียวกับการตัดสินใจหรือตัวบล็อกถูกลบออก .

วิธีนี้ใช้ได้ผลเหมือนกันสำหรับกลุ่มและแต่ละตัวอย่าง


นอกจากนี้ฉันไม่แน่ใจว่ามันใช้งานได้เหมือนกันสำหรับการอธิบายหรือไม่ แต่ในระหว่างรอดำเนินการทดสอบจริงและจะล้มเหลวหากการทดสอบเริ่มผ่าน xdescribe (ฉันเดาว่าเหมือน xit) - ไม่ได้เรียกใช้
PL J

1
ยืนยันว่าใช้งานได้กับทั้งสองpending:และskip:ใน rspec 3.6.0 ดูเหมือนจะเป็นทางออกที่ดีที่สุดสำหรับฉัน ใน rspec3 ที่รอดำเนินการยังคงรันการทดสอบ แต่skipไม่ดำเนินการ (อย่างไรก็ตามคุณใช้skip)
jrochkind

9

อีกอัน https://gist.github.com/1300152

ใช้ xdescribe, xcontext, xit เพื่อปิดใช้งาน

อัปเดต:

เนื่องจาก rspec 2.11 จะมี xit เป็นค่าเริ่มต้น ดังนั้นรหัสใหม่จะเป็น

# 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

การใช้งาน

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

3

ใช้รอดำเนินการแทนคำอธิบาย หากบล็อกของคุณคือ:

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

คุณสามารถข้ามบล็อกทั้งหมดได้โดย:

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

เพียงเพื่ออธิบายว่าเกิดอะไรขึ้นกับโค้ดของคุณ รวมถึงที่ที่คุณมีมันเพิ่งได้รับการประเมิน (และเรียกใช้) เมื่อไฟล์ถูกโหลดระหว่างการเริ่มต้น อย่างไรก็ตามคุณจำเป็นต้องเรียกใช้เมื่อการทดสอบทำงาน นั่นเป็นเหตุผลที่คำตอบแนะนำให้ใส่pending(RSpec 2) หรือskip(RSpec 3) ลงในbeforeบล็อก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.