ตั้งค่า RSpec เพื่อทดสอบอัญมณี (ไม่ใช่ Rails)


154

มันค่อนข้างง่ายด้วยตัวกำเนิดที่เพิ่มของ rspec-rails เพื่อติดตั้ง RSpec สำหรับทดสอบแอพพลิเคชั่น Rails แต่วิธีการเกี่ยวกับการเพิ่ม RSpec สำหรับการทดสอบอัญมณีในการพัฒนา? ฉันไม่ได้ใช้งานเครื่องเพชรพลอยหรือเครื่องมือเช่นนั้น ฉันเพิ่งใช้ Bundler ( bundle gem my_gem) เพื่อตั้งค่าโครงสร้างสำหรับอัญมณีใหม่และแก้ไข * .gemspec ด้วยตนเอง ฉันยังเพิ่มs.add_development_dependency "rspec", ">= 2.0.0"การ gemspec bundle installและไม่

มีกวดวิชาที่ดีจะทำอย่างไรต่อไปเพื่อให้ RSpec ทำงานได้หรือไม่


ฉันเดาว่าฉันต้องเขียนหนึ่ง :-) ... อย่างน้อยก็มีอัญมณีสองอย่างที่รวมเข้าด้วยกันแล้ว: actions-as-taggable-on และ actions_as_geocodable
Zardoz

คำตอบ:


255

ฉันได้อัปเดตคำตอบนี้เพื่อให้ตรงกับแนวทางปฏิบัติที่ดีที่สุดในปัจจุบัน:

Bundler สนับสนุนการพัฒนาอัญมณีอย่างสมบูรณ์แบบ หากคุณกำลังสร้างอัญมณีสิ่งเดียวที่คุณต้องมีใน Gemfile คือ:

source "https://rubygems.org"
gemspec

นี้จะบอก Bundler เข้าไปดูในไฟล์ gemspec bundle installของคุณสำหรับการอ้างอิงเมื่อคุณเรียกใช้

ถัดไปตรวจสอบให้แน่ใจว่า RSpec เป็นการพัฒนาอัญมณีของคุณ แก้ไข gemspec เพื่อให้อ่าน:

spec.add_development_dependency "rspec"

จากนั้นสร้างspec/spec_helper.rbและเพิ่มสิ่งที่ชอบ:

require 'bundler/setup'
Bundler.setup

require 'your_gem_name' # and any other gems you need

RSpec.configure do |config|
  # some (optional) config here
end

สองบรรทัดแรกบอกให้ Bundler โหลดเฉพาะอัญมณีใน gemspec ของคุณ เมื่อคุณติดตั้งอัญมณีของคุณเองในเครื่องของคุณเองสิ่งนี้จะบังคับข้อกำหนดของคุณให้ใช้รหัสปัจจุบันไม่ใช่รุ่นที่คุณติดตั้งแยกต่างหาก

สร้างข้อมูลจำเพาะตัวอย่างเช่นspec/foobar_spec.rb:

require 'spec_helper'
describe Foobar do
  pending "write it"
end

ทางเลือก: เพิ่ม.rspecไฟล์สำหรับตัวเลือกเริ่มต้นและวางไว้ในเส้นทางรากของอัญมณี:

--color
--format documentation

ในที่สุด: เรียกใช้ specs:

$ rspec spec/foobar_spec.rb

75
เพื่อความเป็นธรรมคุณควรเรียกใช้คำสั่ง init ของ RSpec เพื่อสร้างไฟล์ Skeleton spec แทนที่จะต้องพิมพ์ด้วยตนเองสิ่งเหล่านี้จะช่วยให้มั่นใจได้ว่าความเข้ากันได้กับเวอร์ชั่นของ RSpec ที่คุณใช้: rspec --init
Attila Györffy

12
rspec --initไม่สามารถใช้ได้เมื่อฉันเขียนสิ่งนี้ แต่จุดดี!
ค.

ที่จริงฉันพบวิธีที่ดีที่สุดในการทำผู้ช่วยในสเป็คคือ: 'rubygems' ต้องการ 'Bundler / setup' Bundler.require (: ค่าเริ่มต้น: การพัฒนา)
mkon

รหัสสามบรรทัดของ @ mkon ทำงานอย่างไรแตกต่างจากรหัสสามบรรทัดของ iain อย่างไร
Nakilon

1
บรรทัดจาก @mkon จะต้องใช้อัญมณีทั้งหมดในการพัฒนาและกลุ่มการทดสอบในขณะที่วิธีการของฉันคือการต้องใช้อัญมณีทุกชิ้นด้วยตนเอง เนื่องจากคุณต้องใช้อัญมณีทุกตัวเมื่อสร้างอัญมณีฉันคิดว่ามันเป็นวิธีที่ดีกว่า / ชัดเจนกว่าถึงแม้ว่ามันอาจจะใช้งานได้มากกว่าก็ตาม
274259

53

วิธีการแก้ปัญหาของเลนข้างต้นใช้งานได้ดี!

หากคุณต้องการ Rakefile นี่คือทั้งหมดที่คุณต้องการ:

require 'rspec/core/rake_task'

RSpec::Core::RakeTask.new(:spec)

# If you want to make this the default task
task default: :spec

ตรวจสอบ RDoc สำหรับRakeTaskเพื่อดูตัวเลือกต่าง ๆ ที่คุณสามารถเลือกส่งผ่านไปยังการกำหนดภารกิจได้


26

คุณสามารถสร้างอัญมณีใหม่ของคุณกับ rspec bundler gem --test=rspec my_gemโดยการเรียกใช้ ไม่มีการตั้งค่าเพิ่มเติม!

ฉันลืมสิ่งนี้เสมอ มีการใช้งานที่นี่: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36


1
เรียบร้อย! อย่างไรก็ตามฉันคิดว่าชื่ออัญมณีของคุณควรระบุด้วยขีดล่างแทนตัวอูฐ มิฉะนั้น Bundler สร้างไฟล์ด้วยตัวอักษรตัวพิมพ์ใหญ่ (Bundler 1.7.4)
Malte

Bundler บ่น--test=rspecแต่ก็ยังถามฉันว่าฉันต้องการใช้ Rspec เมื่อฉันวิ่งbundler gem my_gemหรือไม่
Nicolas Mattia

7

นี่เป็นวิธีที่ประหยัดและง่าย (แต่ไม่แนะนำอย่างเป็นทางการ):

ทำให้ dir ในรากของอัญมณีของคุณเรียกว่าspecใส่รายละเอียดของคุณอยู่ที่นั่น คุณอาจติดตั้ง rspec ไว้แล้ว แต่หากคุณไม่มีให้ทำgem install rspecและลืม Gemfiles และ Bundler

ถัดไปคุณจะสร้างสเปคและคุณต้องบอกว่าแอพของคุณอยู่ที่ไหนไฟล์ของคุณอยู่ที่ไหนและรวมไฟล์ที่คุณต้องการทดสอบ (รวมถึงการอ้างอิงใด ๆ ที่มี):

# spec/awesome_gem/awesome.rb
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
$: << File.join(APP_ROOT, 'lib/awesome_gem') # so rspec knows where your file could be
require 'some_file_in_the_above_dir' # this loads the class you want to test

describe AwesomeGem::Awesome do
  before do
    @dog = AwesomeGem::Awesome.new(name: 'woofer!')
  end
  it 'should have a name' do
    @dog.name.should eq 'woofer!'
  end
  context '#lick_things' do
    it 'should return the dog\'s name in a string' do
      @dog.lick_things.should include 'woofer!:'
    end
  end
end

เปิด Terminal และเรียกใช้ rspec:

~/awesome_gem $ rspec
..

Finished in 0.56 seconds
2 examples, 0 failures

หากคุณต้องการ.rspecตัวเลือกบางอย่างที่น่ารักไปทำ.rspecไฟล์และวางไว้ในเส้นทางรากของอัญมณีของคุณ ฉันมีลักษณะเช่นนี้:

# .rspec
--format documentation --color --debug --fail-fast

ง่ายรวดเร็วเรียบร้อย!

ฉันชอบสิ่งนี้เพราะคุณไม่ต้องเพิ่มการพึ่งพาใด ๆ กับโครงการของคุณเลยและสิ่งทั้งหมดนั้นยังคงเร็วมาก bundle execทำให้ช้าลงเล็กน้อยซึ่งเป็นสิ่งที่คุณต้องทำเพื่อให้แน่ใจว่าคุณใช้ rspec รุ่นเดียวกันตลอดเวลา 0.56 วินาทีนั้นใช้เวลาในการรันการทดสอบสองครั้งคือ 99% ถ่ายโดยเวลาที่คอมพิวเตอร์ของฉันโหลด rspec การใช้งานสเป็คนับร้อยควรเร็วอย่างยิ่ง ปัญหาเดียวที่คุณอาจทราบว่าฉันทราบคือถ้าคุณเปลี่ยนเวอร์ชันของ rspec และเวอร์ชันใหม่ไม่เข้ากันได้กับฟังก์ชั่นที่คุณใช้ในการทดสอบคุณอาจต้องเขียนการทดสอบอีกครั้ง

นี่เป็นสิ่งที่ดีถ้าคุณทำสเปคแบบครั้งเดียวหรือมีเหตุผลที่ดีที่จะไม่ใส่ rspec ใน gemspec ของคุณอย่างไรก็ตามมันไม่ดีสำหรับการเปิดใช้งานการแชร์หรือบังคับใช้ความเข้ากันได้


มีวิธีที่จะไม่วาง AwesomeGem :: ก่อนชื่อคลาสทุกครั้งที่คุณอ้างถึงวัตถุทดสอบหรือไม่? หรือเมื่อคุณสร้างการทดสอบใหม่เช่นในตัวอย่างของคุณ
Misha Slyusarev

1
แน่นอนว่าคุณสามารถตั้งชื่อคลาสของคุณให้สั้นลงได้เหมือนThing = AwesomeGem::Awesomeหรือคุณสามารถทำแบบทดสอบในโมดูลเช่นmodule AwesomeGem; it 'stuff' do; Awesome.new ... end; end
wulftone
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.