2010-11-15 15 views

उत्तर

52

should और should_not एक दूसरा तर्क ले (message) जो मैचर के डिफ़ॉल्ट को ओवरराइड करता है संदेश।

1.should be(2), 'one is not two!' 

हालांकि डिफ़ॉल्ट संदेश आमतौर पर बहुत उपयोगी होते हैं।

अद्यतन:

RSpec 3 के लिए

:

expect(1).to eq(2), "one is not two!" 
+0

बहुत बहुत धन्यवाद! यह कार्य करता है! –

+4

कोई इसे #Should ==' के साथ कैसे करता है? –

+1

@mohawkjohn: ऐसा लगता है जैसे यह कुछ होगा 1. 1. शॉल (शून्य, 'एक दो नहीं है!') == 2' (ick), लेकिन यह काम करता है क्योंकि '==' ऑपरेटर मैचर ऐसा लगता है कि यह हमेशा अपना संदेश उत्पन्न करता है। –

27

आरएसपीसी में, यह एक समझदार विफलता संदेश मुद्रित करने के लिए matcher का काम है। आरएसपीईसी के साथ शिप करने वाले जेनेरिक मैचर्स स्पष्ट रूप से केवल सामान्य गैर-वर्णना विफलता संदेशों को प्रिंट कर सकते हैं, क्योंकि वे आपके विशेष डोमेन के बारे में कुछ नहीं जानते हैं। यही कारण है कि यह अनुशंसा की जाती है कि आप अपना स्वयं का डोमेन-विशिष्ट मैचर्स लिखें, जो आपको अधिक पठनीय परीक्षण और अधिक पठनीय विफलता संदेश देगा।

require 'rspec/expectations' 

RSpec::Matchers.define :be_a_multiple_of do |expected| 
    match do |actual| 
    (actual % expected).zero? 
    end 
    failure_message_for_should do |actual| 
    "expected that #{actual} would be a multiple of #{expected}" 
    end 
    failure_message_for_should_not do |actual| 
    "expected that #{actual} would not be a multiple of #{expected}" 
    end 
    description do 
    "be multiple of #{expected}" 
    end 
end 

नोट::

यहाँ RSpec documentation से एक उदाहरण है केवल match की आवश्यकता है, दूसरों को बना दी जाएगी। हालांकि, आपके प्रश्न का पूरा बिंदु निश्चित रूप से है कि आप डिफ़ॉल्ट संदेशों की तरह नहीं करते हैं, इसलिए आपको कम से कम failure_message_for_should को परिभाषित करने की आवश्यकता है।

इसके अलावा, यदि आप सकारात्मक और नकारात्मक मामले में अलग-अलग तर्क की आवश्यकता है तो match के बजाय match_for_should और match_for_should_not को परिभाषित कर सकते हैं।

@Chris Johnsen के रूप में दिखाता है, आप स्पष्ट रूप से उम्मीद के लिए एक संदेश भी पारित कर सकते हैं। हालांकि, आप पठनीयता लाभ खोने का जोखिम चलाते हैं।

user.permissions.should be(42), 'user does not have administrative rights' 
इस के साथ

:

इसकी तुलना

user.should have_administrative_rights 

(मोटे तौर पर) इस तरह लागू किया जाएगा कि:

require 'rspec/expectations' 

RSpec::Matchers.define :have_administrative_rights do 
    match do |thing| 
    thing.permissions == 42 
    end 
    failure_message_for_should do |actual| 
    'user does not have administrative rights' 
    end 
    failure_message_for_should_not do |actual| 
    'user has administrative rights' 
    end 
end 
+1

धन्यवाद, मुझे नहीं पता था कि मैचर्स को परिभाषित करने का मानक तरीका इतना आसान है। हालांकि मैं "आलसी" होना पसंद करता हूं: ऐसी चीजों को अलग-अलग नामित इकाइयों में कारगर करने के लिए जब वे कम से कम दो बार प्रकट होते हैं या उल्लेखनीय रूप से संदर्भ को सरल बनाते हैं जहां उनका उपयोग किया जाता है। – Alexey

4

मेरे मामले में यह कोष्ठक की एक समस्या थी:

 expect(coder.is_partial?(v)).to eq p, "expected #{v} for #{p}" 

इस तर्क का एक गलत नंबर में हुई है, जबकि सही तरीका है:

 expect(coder.is_partial?(v)).to eq(p), "expected #{v} for #{p}" 
+0

RSpec 3 के लिए उत्तर जोड़ने के लिए धन्यवाद :) – Alexey

+0

Finaly मुझे यह समाधान मिला। आपका बहुत बहुत धन्यवाद। – Foton

+0

हाँ, यह मेरे लिए था। '.to (सत्य) 'का उपयोग करना। – djangofan

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