rspec

2013-07-17 8 views
17

में डालता है परीक्षण करने के लिए मैं कमांड लाइन पर ruby sayhello.rb चलाता हूं, फिर Hello from Rspec प्राप्त करें।rspec

मुझे लगता है कि मिल गया है इस के साथ:

class Hello 
    def speak 
    puts 'Hello from RSpec' 
    end 
end 

hi = Hello.new #brings my object into existence 
hi.speak 

अब मैं जाँच करने के लिए कमांड लाइन उत्पादन वास्तव में "RSpec से नमस्ते" और नहीं rspec में एक परीक्षण लिखना चाहते हैं "मैं यूनिक्स की तरह "

काम नहीं कर रहा है। मैं वर्तमान में

require_relative 'sayhello.rb' #points to file so I can 'see' it 

describe "sayhello.rb" do 
    it "should say 'Hello from Rspec' when ran" do   
    STDOUT.should_receive(:puts).with('Hello from RSpec')  
    end 
end 

इसके अलावा, मैं वास्तव में क्या परीक्षण मेरी rspec में की तरह दिखना चाहिए कृपया देखने की जरूरत मेरी sayhello_spec.rb फ़ाइल में इस किया है।

उत्तर

13

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

describe "sayhello.rb" do 
    it "should say 'Hello from Rspec' when ran" do   
    STDOUT.should_receive(:puts).with('Hello from RSpec') 
    require_relative 'sayhello.rb' #load/run the file 
    end 
end 
+0

'sayhello.rb' में कोड के बारे में rspec कैसे पता चलेगा? – bswinnerton

+1

आरएसपीसी को 'sayhello.rb' में कोड (यानी एक्सेस) के बारे में जानने की आवश्यकता नहीं है। यह कल्पना बस 'STDOUT.puts' पर एक उम्मीद डाल रही है जो रूबी में बनाई गई है। 'hehello.rb' लोड होने और चलाने के बाद उम्मीद पूरी हो जाती है (यानी '' की आवश्यकता होती है)। –

+5

यह नया आरएसपीईसी सिंटैक्स के साथ समान उम्मीद है: 'उम्मीद (STDOUT)। प्राप्त करने के लिए (: puts)। (" RSpec से हैलो ")' – Jankeesvw

11

आप इस रेल 'active_support पुस्तकालय है, जो एक capture कहते हैं का उपयोग कर हल कर सकते हैं: इस प्रकार आप, उम्मीदों की स्थापना (STDOUT.... बयान के बाद require_relative बयान ले जाकर जैसे) के बाद परीक्षण ब्लॉक के भीतर कोड चलाने की आवश्यकता विधि:

require 'active_support/core_ext/kernel/reporting' 
require_relative 'sayhello' 

describe Hello do 
    it "says 'Hello from RSpec' when ran" do 
    output = capture(:stdout) do 
     hi = Hello.new 
     hi.speak 
    end 
    expect(output).to include 'Hello from RSpec' 
    end 
end 
+10

'# कैप्चर' को हटा दिया गया है और रेल 5 में हटा दिया जाएगा। https://github.com/rails/rails/blob/dd7bd8c023696657a600ee5dba16bfe5def876bf/activesupport/lib/active_support/core_ext/kernel/reporting.rb#L91 – barelyknown

9

पिछले जवाब/टिप्पणियों के आधार पर, एक मणि के बिना नई सिंटैक्स का उपयोग एक समाधान इस प्रकार दिखाई देगा:

describe "sayhello.rb" do 
    it "should say 'Hello from Rspec' when run" do   
    expect(STDOUT).to receive(:puts).with('Hello from RSpec') 
    require_relative 'sayhello.rb' # load/run the file 
    end 
end 
3

कुछ हद तक bswinnerton के उत्तर के समान है, कोई puts आउटपुट कैप्चर कर सकता है और फिर कैप्चर किए गए आउटपुट के खिलाफ परीक्षण कर सकता है, लाइब्रेरी-निर्भर capture विधि (जिसे किसी ने उल्लेख किया है रेल 5 में बहिष्कृत किया जा रहा है) का उपयोग किए बिना।

रूबी का वैश्विक चर नाम $stdout है जो डिफ़ॉल्ट रूप से निरंतर STDOUT द्वारा पॉप्युलेट किया जाता है। STDOUT वह है जो रूबी प्रक्रिया की stdout स्ट्रीम में डेटा भेजता है (सुनिश्चित नहीं है कि "स्ट्रीम" सही शब्द है)। मूल रूप से एक बेवकूफ मामले में STDOUT.puts("foo") परिणामस्वरूप आपकी टर्मिनल विंडो में "foo \ n" दिखाई देगा। $stdout.puts("foo") वही काम करेगा क्योंकि $stdout परिवर्तनीय नाम STDOUTको संदर्भित करता है जब तक कि आप इसे (मुख्य बिंदु यहां) पुन: असाइन नहीं करते। अंत में puts("foo")$stdout.puts("foo") के लिए वाक्य रचनात्मक चीनी है।

रणनीति फिर $stdout को स्थानीय IO उदाहरण पर पुन: असाइन करना है, जिसे आप अपना कोड चलाने के बाद निरीक्षण कर सकते हैं, यह देखने के लिए कि "हैलो से आरएसपीईसी" इसकी सामग्री में दिखाई दे रहा है या नहीं।

यह कैसे काम करेगा:

describe "sayhello.rb" do 
    it "should say 'Hello from Rspec' when ran" do   
    $stdout = StringIO.new 

    # run the code 
    # (a little funky; would prefer Hello.new.speak here but only changing one thing at a time) 
    require_relative 'sayhello.rb' 

    $stdout.rewind # IOs act like a tape so we gotta rewind before we play it back 

    expect($stdout.gets.strip).to eq('Hello from Rspec') 
    end 
end 
+0

क्या इस विधि का उपयोग एकाधिक स्टडआउट संदेशों की जांच के लिए किया जा सकता है? (तुलना में अन्य उत्तरों जो एक की जांच करते हैं) –

+2

@matrim_c: मुझे पता है कि यह आपके लिए देर हो चुकी है लेकिन यहां आने वाले किसी और के लिए इसका उत्तर देना। हां आप एकाधिक stdout संदेशों के परीक्षण के लिए इसका उपयोग कर सकते हैं। स्ट्रिंगियो ऑब्जेक्ट एक फ़ाइल की तरह काम करता है, कई लाइनों के साथ। 'get' एक पंक्ति को पढ़ने के लिए एक आदेश है (न्यूलाइन वर्ण '\ n' सहित), फिर रीड हेड को अगली पंक्ति के पहले अक्षर पर ले जाएं। कई बार 'हो जाता है' कॉल करने से लाइनों को 'puts' के साथ जोड़ा गया था। स्ट्रिंगियो पर 'रीड' को कॉल करने से आपको लाइनों के बीच '\ n' वर्णों सहित संपूर्ण सामग्री मिल जाएगी। –

7

मुझे लगता है कि सबसे अच्छा तरीका है rspec का उपयोग उत्पादन मिलान में https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/output-matcher

फोर उदाहरण का निर्माण करना है, यह आपके वर्ग है

class MakeIt 
    def awesome(text) 
    puts "Awesome #{text}" 
    end 
end 

और आपका परीक्षण

describe MakeIt do 
    describe '#awesome' do 
    it 'prints awesome things' do 
     expect do 
     MakeIt.new.awesome('tests') 
     end.to output('Awesome tests').to_stdout 
    end 

    it 'does not print not awesome things' do 
     expect do 
     MakeIt.new.awesome('tests') 
     end.to_not output('Not awesome tests').to_stdout 
    end 
    end 
end 

अच्छा, साफ और पुस्तक द्वारा!

 संबंधित मुद्दे