रत्न परीक्षण करने के लिए RSpec सेटअप करें (रेल नहीं)


154

यह एक रेल अनुप्रयोग के परीक्षण के लिए RSpec सेटअप करने के लिए rspec- रेल के अतिरिक्त जनरेटर के साथ बहुत आसान है। लेकिन विकास में मणि के परीक्षण के लिए RSpec को कैसे जोड़ा जाए? मैं जौहरी या ऐसे उपकरणों का उपयोग नहीं कर रहा हूं। मैंने बस bundle gem my_gemनए रत्न के लिए संरचना को सेटअप करने और मैन्युअल रूप से * .gemspec को संपादित करने के लिए बुंडलर ( ) का उपयोग किया । मैंने s.add_development_dependency "rspec", ">= 2.0.0"रत्नों को भी जोड़ा और ए bundle install

वहाँ कुछ अच्छा ट्यूटोरियल है कि आगे क्या करने के लिए RSpec काम कर रहा है?


मुझे लगता है कि मुझे एक लिखना होगा :-) ... कम से कम दो रत्न हैं जो पहले से ही इसे अच्छी तरह से एकीकृत करते हैं: कार्य-जैसा-टैग करने योग्य-पर और कृत्यों पर काम करता है।
जरदोज़ डे

जवाबों:


255

मैंने वर्तमान सर्वोत्तम प्रथाओं से मेल खाने के लिए यह उत्तर दिया है:

बंडलर मणि विकास का पूरी तरह से समर्थन करता है। यदि आप एक मणि बना रहे हैं, तो केवल एक चीज जो आपके रत्न में होनी चाहिए, वह निम्नलिखित है:

source "https://rubygems.org"
gemspec

यह बंडलर को बताता है कि जब आप चलाते हैं, तो निर्भरता के लिए अपने जवाहरात फ़ाइल के अंदर देखना चाहिए bundle install

अगला, सुनिश्चित करें कि RSpec आपके मणि का विकास निर्भरता है। रत्नों को संपादित करें ताकि यह पढ़ें:

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

पहली दो पंक्तियाँ बुंडलर से कहती हैं कि अपने रत्नों के अंदर केवल रत्नों को लोड करें। जब आप अपनी खुद की मशीन पर अपना रत्न स्थापित करते हैं, तो यह आपके चश्मे को आपके वर्तमान कोड का उपयोग करने के लिए मजबूर करेगा, न कि आपके द्वारा अलग से इंस्टॉल किए गए संस्करण पर।

उदाहरण के लिए, एक युक्ति बनाएँ spec/foobar_spec.rb:

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

वैकल्पिक: .rspecडिफ़ॉल्ट विकल्पों के लिए एक फ़ाइल जोड़ें और इसे अपने रत्न के मूल पथ में डालें:

--color
--format documentation

अंत में: चश्मा चलाएं:

$ rspec spec/foobar_spec.rb

75
निष्पक्ष होने के लिए, आपको इसके बजाय मैन्युअल रूप से टाइप करने के लिए युक्ति कंकाल फ़ाइलों को उत्पन्न करने के लिए RSpec के init कमांड को आमंत्रित करना चाहिए। यह RSpec के संस्करण के साथ संगतता सुनिश्चित करेगा जिसे आप उपयोग कर रहे हैं: rspec --init
Attila Györffer

12
rspec --initउपलब्ध नहीं था जब मैंने यह लिखा था, लेकिन अच्छी बात!
आईएन

वास्तव में मैं कल्पना सहायक में आवश्यकताओं को करने का सबसे अच्छा तरीका है यह है: 'rubygems' के लिए 'bundler / setup' की आवश्यकता है Bundler.require (: डिफ़ॉल्ट,: विकास)
mkon

वास्तव में @ mkon की कोड की तीन लाइनें, iain की तीन लाइनों के कोड से अलग कैसे काम करती हैं?
Nakilon

1
@Mkon की लाइनों को विकास और परीक्षण समूहों में सभी रत्नों की आवश्यकता होगी, जबकि मेरा दृष्टिकोण मैन्युअल रूप से प्रत्येक रत्न की आवश्यकता है। चूंकि रत्नों को बनाते समय आपको प्रत्येक रत्न की आवश्यकता होती है, इसलिए मुझे लगता है कि यह बेहतर / स्पष्ट दृष्टिकोण है, भले ही यह थोड़ा अधिक काम हो।
Iain

53

ऊपर दिए गए Iain का समाधान बढ़िया काम करता है!

यदि आप भी एक Rakefile चाहते हैं, तो आपको केवल यही चाहिए:

require 'rspec/core/rake_task'

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

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

विभिन्न विकल्पों के लिए RakeTask के लिए RDoc की जाँच करें जिन्हें आप वैकल्पिक रूप से कार्य परिभाषा में पास कर सकते हैं।


26

आप दौड़ लगाकर अपने नए रत्न को rspec के साथ उत्पन्न कर सकते हैं bundler gem --test=rspec my_gem। कोई अतिरिक्त सेटअप नहीं!

मैं हमेशा यह भूल जाता हूं। इसे यहां लागू किया गया है: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli-gem.rb#L36


1
साफ! हालाँकि, मुझे लगता है कि ऊंट के मामले के बजाय आपके रत्न का नाम अंडरस्कोर के साथ निर्दिष्ट किया जाना चाहिए। अन्यथा बुंडलर अपर केस लेटर्स (बुंडलर 1.7.4)
माल्टे

बुंडलर ने इसके बारे में शिकायत की --test=rspec, लेकिन इसने मुझसे पूछा कि क्या मैं दौड़ने के समय Rspec का उपयोग करना चाहता हूं bundler gem my_gem
निकोलस मटिया

7

यहाँ एक सस्ता और आसान (हालांकि आधिकारिक तौर पर अनुशंसित नहीं) तरीका है:

अपने मणि की जड़ में एक दिर कहा जाता है spec, अपने चश्मे को वहाँ रखें। आप शायद पहले से ही rspec स्थापित कर चुके हैं, लेकिन अगर आप ऐसा नहीं करते हैं, तो बस gem install rspecGemfiles और बंडल को भूल जाएं।

इसके बाद, आप एक कल्पना करेंगे, और आपको यह बताना होगा कि आपका ऐप कहाँ है, आपकी फ़ाइलें कहाँ हैं, और उस फ़ाइल को शामिल करें जिसे आप परीक्षण करना चाहते हैं (इसके साथ जो भी निर्भरताएँ हैं):

# 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

टर्मिनल खोलें और rspec चलाएं:

~/awesome_gem $ rspec
..

Finished in 0.56 seconds
2 examples, 0 failures

यदि आप कुछ .rspecविकल्प पसंद करते हैं, तो एक .rspecफ़ाइल बनाएं और इसे अपने रत्न के मूल पथ में डालें। मेरा ऐसा दिखता है:

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

आसान, तेज, साफ!

मुझे यह पसंद है क्योंकि आपको अपनी परियोजना पर कोई निर्भरता नहीं जोड़ना है, और पूरी बात बहुत तेज है। bundle execचीजों को थोड़ा धीमा कर देता है, जो कि आपको यह सुनिश्चित करने के लिए करना होगा कि आप हर समय एक ही संस्करण का उपयोग कर रहे हैं। दो परीक्षण चलाने में जो 0.56 सेकंड का समय लगा, उसमें 99% समय लगा, जब तक कि मेरे कंप्यूटर को rspec लोड करना शुरू हुआ। सैकड़ों ऐनक दौड़ना बहुत तेज होना चाहिए। केवल एक ही समस्या जिसे आप चला सकते हैं, मुझे पता है कि यदि आप rspec के संस्करण बदलते हैं और नया संस्करण आपके परीक्षण में उपयोग किए गए कुछ फ़ंक्शन के साथ पीछे की ओर संगत नहीं है, तो आपको कुछ परीक्षण फिर से लिखने पड़ सकते हैं।

यह अच्छा है अगर आप वन-ऑफ स्पेक्स कर रहे हैं या आपके पास अपने रत्न-भंडार में rspec को शामिल नहीं करने का कोई अच्छा कारण है, हालांकि यह साझाकरण को सक्षम करने या अनुकूलता को बढ़ाने के लिए बहुत अच्छा नहीं है।


क्या कोई ऐसा तरीका है जो भयानक रूप से नहीं डाला जाता है :: क्लास के नामों से पहले किसी भी समय आप एक परीक्षण वस्तु का उल्लेख करते हैं? या जब आप अपने उदाहरण में एक नया परीक्षण बनाते हैं।
मीशा स्लेयसुरेव

1
ज़रूर, आप या तो अपने वर्ग के नाम को कुछ छोटे के बराबर सेट कर सकते हैं, जैसे Thing = AwesomeGem::Awesomeया आप एक मॉड्यूल के अंदर परीक्षण कर सकते हैं, जैसेmodule AwesomeGem; it 'stuff' do; Awesome.new ... end; end
वुल्फटोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.