ฉันจะเพิกเฉยสีบรรทัดคำสั่งสำหรับคำสั่งที่ทำงานภายใน rspec ได้อย่างไร

ฉันกำลังเขียน Ruby Gem โดยใช้ Commander ซึ่งใช้เทมเพลต erb และ $terminal.color สำหรับเอาต์พุตบางส่วน เมื่อเขียนการทดสอบใน RSpec (โดยใช้ การทดสอบ CLI) ฉันต้องการให้ผ่านตัวเลือกได้ คำสั่งของฉันเพื่อป้องกันการปรับสีเพื่อให้การทดสอบของฉันสามารถจับคู่สตริงแบบง่ายแทนที่จะต้องรวมการจัดรูปแบบในการเปรียบเทียบสตริงของฉัน

ขณะนี้ฉันกำลังใช้:

execute_script('mycommand arg1')
expect(last_execution.stdout).to include("Expected Colorized Output")

แต่สมมติว่าคำว่า "Colorized" เป็นตัวหนา การทดสอบนี้จะล้มเหลวเนื่องจากมีอักขระอื่นล้อมรอบ ดังนั้นฉันจึงต้องเขียนการทดสอบแบบนี้

execute_script('mycommand arg1')
expect(last_execution.stdout).to include("Expected")
expect(last_execution.stdout).to include("Colorized")
expect(last_execution.stdout).to include("Output")

ฉันต้องการหลีกเลี่ยงการแยกการทดสอบด้วยวิธีนี้ - มีวิธีใดบ้างที่ฉันจะผ่านตัวเลือกภายในการโทร execute_script ในการทดสอบของฉัน หรือกำหนดค่า RSpec ให้ลบการจัดรูปแบบสำหรับการทดสอบ

สตริงตัวอย่างที่ RSpec เห็น

# successfully is bolded here
Command ran \e[1m\e[32msuccessfully\e[0m

ที่ฉันอยากจะวิ่งฝ่าฟันไปได้

expect(last_execution.stdout).to include("Command ran successfully")

person Rabbott    schedule 04.08.2016    source แหล่งที่มา
comment
คุณสามารถล้อม include("Expected Colorized Output") ด้วยการใส่สีเช่น include(bold(red("Expected Colorized Output"))) --- ที่สร้างไวยากรณ์นี้ขึ้นมาอย่างแท้จริง แต่บางทีบางอย่างในบรรทัดเหล่านั้นอาจใช้ได้ผลใช่ไหม   -  person jefflunt    schedule 04.08.2016
comment
แนวคิดก็คือตัวเทมเพลตนั้นไม่สำคัญ ดังนั้นหากเป็นสีแดง เขียว หรือตัวหนา การทดสอบก็จะยังผ่าน 'การออกแบบ' เทมเพลตอาจมีการเปลี่ยนแปลงเล็กน้อย แต่การคัดลอกจะไม่เปลี่ยนแปลง   -  person Rabbott    schedule 04.08.2016
comment
อืม คุณสามารถรวมผลลัพธ์ดิบ (ที่ rspec มองเห็นได้) ในคำถามของคุณได้ไหม เช่น. พิมพ์ last_execution.stdout ไปยังคอนโซลเพื่อให้คุณ (และเรา) เห็นว่า rspec เห็นอะไร?   -  person jefflunt    schedule 04.08.2016
comment
อัปเดตคำถามพร้อมตัวอย่าง   -  person Rabbott    schedule 04.08.2016
comment
อา. บางทีคุณอาจทดสอบสตริง successfully ได้ เนื่องจากนั่นระบุสถานะ และเป็นสตริงที่ไม่ขาดตอนภายในการปรับสี   -  person jefflunt    schedule 04.08.2016
comment
นั่นคือสิ่งที่ฉันกำลังทำอยู่ และระบุในคำถามว่าฉันพยายามหลีกเลี่ยงสิ่งนั้น   -  person Rabbott    schedule 04.08.2016
comment
ให้เราสนทนาต่อในการแชท   -  person jefflunt    schedule 04.08.2016


คำตอบ (2)


ลองลบสัญลักษณ์หลีก ANSI ออกจากสตริงด้วย RegExp ต่อไปนี้: /\e\[(\d+)m/

"Command ran \e[1m\e[32msuccessfully\e[0m".gsub(/\e\[(\d+)m/, "")
 => "Command ran successfully"

RegExp ถูกนำมาจาก ansi gem https://github.com/rubyworks/ansi

https://github.com/rubyworks/ansi/blob/17002348d45ce9298a1a4017dc43d3cf65151bd4/lib/ansi/code.rb#L44

https://github.com/rubyworks/ansi/blob/17002348d45ce9298a1a4017dc43d3cf65151bd4/lib/ansi/code.rb#L193-L208

ฉันไม่แน่ใจว่า regexp นี้ถูกต้องที่สุดสำหรับงานนี้หรือไม่ ฉันพบคำตอบอื่นในคำตอบนี้: ฉันจะลบลำดับการหลีก ANSI ออกจากสตริงใน python ได้อย่างไร

/(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]/

คำตอบหมายถึงมาตรฐานที่เกี่ยวข้อง ดังนั้นบางทีอันนี้อาจจะสมบูรณ์กว่านี้

person SunnyMagadan    schedule 04.08.2016
comment
คุ้มค่าที่จะลอง -- ฉันจะดูว่าฉันไม่สามารถเขียนเครื่องมือจับคู่ที่กำหนดเองเพื่อตัดสิ่งนั้นออกแล้วรายงานกลับมาได้หรือไม่ ขอบคุณ! - person Rabbott; 04.08.2016
comment
Ruby (rubular) ไม่ชอบ regex ที่คุณแนะนำ แต่น่าเสียดายที่เกิดจากการคลิกที่มาจากลิงก์ของคุณด้านบน (ช่วยฉันด้วยถ้อยคำของคำค้นหาของฉันจริงๆ) ฉันสามารถค้นหา /\e\[\d+m/ เป็นการทดแทนที่มั่นคงได้ ฉันได้รวมวิธีแก้ปัญหาสุดท้ายไว้ในคำตอบแล้ว ขอบคุณสำหรับความช่วยเหลือของคุณ! - person Rabbott; 05.08.2016
comment
ขออภัย ฉันพลาด regex ในตอนต้นของคำตอบของคุณ เห็นเพียงอันที่ด้านล่างเท่านั้น โซลูชันของคุณคือ regex ที่ฉันกำลังมองหา ฉันได้รวมคำตอบไว้ด้านล่างซึ่งแสดงการใช้งาน regex จริงของฉัน - person Rabbott; 05.08.2016

การใช้ regex /\e\[\d+m/ ของ @SunnyMagadan ที่สามารถระบุตำแหน่งการกำหนดสีได้สำเร็จ แทนที่จะต้องรวมสิ่งนี้ไว้ในการทดสอบทั้งหมด ฉันขยายคลาส CliTest Execution และเพิ่มเมธอด stripped_stdout ที่ใช้ regex เพื่อตัด stdout ที่กำหนดไว้แล้วโดยคลาส

ฉันเพิ่มโค้ดนี้ลงในไฟล์ใน /spec/support และนำเข้าใน spec_helper.rb ของฉัน

module CliTest
  class Execution
    # Strips out ansi colorization leaving unformatted text
    def stripped_stdout
      @stdout.gsub(/\e\[\d+m/, '')
    end
  end
end

สิ่งนี้ทำให้ฉันสามารถใช้สิ่งต่อไปนี้ในการทดสอบของฉัน

expect(last_execution.stripped_stdout).to include("Expected Colorized Output")

ซึ่งเป็นวิธีแก้ปัญหาที่ฉันพอใจ สิ่งนี้ไม่รบกวนฟังก์ชันการทำงานอื่นๆ และช่วยให้ฉันใช้ Last_execution.stdout ต่อไปได้ถ้า/เมื่อฉันต้องการ

person Rabbott    schedule 05.08.2016