RSpec: कैसे विधि का परीक्षण किया जाता है?


112

RSpec परीक्षण लिखते समय, मैं खुद को बहुत सारे कोड लिखता हूं जो इस तरह दिखता है ताकि यह सुनिश्चित हो सके कि परीक्षण के निष्पादन के दौरान एक विधि को बुलाया गया था (तर्क के लिए, आइए हम कहते हैं कि मैं वास्तव में राज्य से पूछताछ नहीं कर सकता हूं कॉल के बाद ऑब्जेक्ट क्योंकि ऑपरेशन जिस विधि से करता है उसका प्रभाव देखना आसान नहीं है)।

describe "#foo"
  it "should call 'bar' with appropriate arguments" do
    called_bar = false
    subject.stub(:bar).with("an argument I want") { called_bar = true }
    subject.foo
    expect(called_bar).to be_true
  end
end

मैं जो जानना चाहता हूं वह है: क्या इस से एक अच्छा सिंटैक्स उपलब्ध है? क्या मुझे कुछ फ़र्ज़ी RSpec awesomeness याद आ रही है जो उपरोक्त कोड को कुछ लाइनों तक कम कर देंगे? should_receiveऐसा लगता है कि ऐसा करना चाहिए, लेकिन आगे पढ़ने पर ऐसा लगता है कि यह वास्तव में ऐसा नहीं है।


3
यहां देखें: stackoverflow.com/questions/1328277/…
kddeisz

@Peter अल्फविन ओपी सिंटैक्स पर पूछ should_receiveरहा था, इसलिए मैंने सोचा कि प्रश्न मदद करेगा।
kddeisz

जवाबों:


141
it "should call 'bar' with appropriate arguments" do
  expect(subject).to receive(:bar).with("an argument I want")
  subject.foo
end

1
क्षमा करें, मैं समझ नहीं पा रहा हूँ कि इस उदाहरण में "बुलाया_bar" के मान के लिए "से .. प्राप्त (: बार)" का यह प्रारूप कैसे जाँचता है। क्या आप मुझे समझा सकते हैं?
इकोडिंग 5

2
@ इकोडिंग 5 नं। यह और न ही के लिए जाँच करनी चाहिए called_bar। यह सिर्फ यह सुनिश्चित करने के लिए एक झंडा था कि विधि को बुलाया गया था, लेकिन expect(...).to receive(...)आप पहले से ही इसे कवर कर रहे हैं। यह अधिक स्पष्ट और अर्थपूर्ण है
wacko

@wacko oooh, मिल गया, कि समाशोधन के लिए धन्यवाद। मैंने इसे पहली बार नहीं पकड़ा था।
इकोडिंग 5


37

नीचे काम करना चाहिए

describe "#foo"
  it "should call 'bar' with appropriate arguments" do
     subject.stub(:bar)
     subject.foo
     expect(subject).to have_received(:bar).with("Invalid number of arguments")
  end
end

प्रलेखन: https://github.com/rspec/rspec-mocks#expecting-arguments


धन्यवाद - मुझे "NoMethodError" has_received प्राप्त हुआ था? - लगता है कि यह rspec छंद के साथ हालांकि हो सकता है। मुझे एक और समाधान मिला जो मेरे लिए काम करता था (एक ऊपर सही चिह्नित)
मिकी हॉगर्थ

@ मायिकहोगर्थ यह उत्तर सुझा रहा था have_received(तथ्य "जासूस" दृष्टिकोण के बाद), नहीं has_received, जो कि आरएसपीके के किसी भी संस्करण का हिस्सा नहीं है जो मुझे पता है।
पीटर अल्फविन

2

RSpec ~> 3.1 सिंटैक्स और rubocop-rspecनियम के लिए डिफ़ॉल्ट विकल्प का पूरी तरह से पालन करने के लिए RSpec/MessageSpies, यहां आप क्या कर सकते हैं spy:

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

# arrange.
invitation = spy('invitation')

# act.
invitation.deliver("foo@example.com")

# assert.
expect(invitation).to have_received(:deliver).with("foo@example.com")

यदि आप रुबोकॉप-आरस्पेक का उपयोग नहीं करते हैं या गैर-डिफ़ॉल्ट विकल्प का उपयोग नहीं करते हैं। आप निश्चित रूप से, उम्मीद के साथ RSpec 3 डिफ़ॉल्ट का उपयोग कर सकते हैं।

dbl = double("Some Collaborator")
expect(dbl).to receive(:foo).with("foo@example.com")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.