2012-12-28 13 views
6

मैं आरएसपीसी का उपयोग कर एक मणि में एक वर्ग स्तर आवृत्ति चर (और सेटर्स) का परीक्षण कर रहा हूं। मुझे निम्न परीक्षण करने की आवश्यकता है:आरएसपीसी कक्षा परिवर्तनीय परीक्षण

  1. अगर सेटर का कभी भी उपयोग नहीं किया जाता है तो सही डिफ़ॉल्ट मान प्रदान किया जाता है।
  2. चर को सेटर्स के माध्यम से सफलतापूर्वक अपडेट किया जा सकता है।

स्पष्ट रूप से यहां एक रन ऑर्डर समस्या है। अगर मैं सेटर्स का उपयोग करके मानों को बदलता हूं, तो मैं डिफ़ॉल्ट मान क्या था इसकी स्मृति खो देता हूं। मैं इसे सेटर परीक्षण से पहले एक चर में सहेज सकता हूं और फिर अंत में मान को रीसेट कर सकता हूं, लेकिन यह केवल तब ही मेरी सुरक्षा करता है जब सभी सेटर परीक्षण एक ही अभ्यास का पालन करते हैं।

चर के डिफ़ॉल्ट मान का परीक्षण करने का सबसे अच्छा तरीका क्या है?

class Foo 
    class << self 
    attr_accessor :items 
    end 
    @items = %w(foo bar baz) # Set the default 
    ... 
end 

describe Foo do 

    it "should have a default" do 
    Foo.items.should eq(%w(foo bar baz)) 
    end 

    it "should allow items to be added" do 
    Foo.items << "kittens" 
    Foo.items.include?("kittens").should eq(true) 
    end 
end 
+0

ओह, तो आपका मतलब है 'Foo.bar = 1'? –

+0

हां, कोड एक उदाहरण के साथ अद्यतन किया गया है। –

उत्तर

8
class Foo 

    DEFAULT_ITEMS = %w(foo bar baz) 
    class << self 
    attr_accessor :items 
    end 
    @items = DEFAULT_ITEMS 

end 

describe Foo do 
    before(:each) { Foo.class_variable_set :@items, Foo::DFAULT_ITEMS } 

    it "should have a default" do 
    Foo.items.should eq(Foo::DEFAULT_ITEMS) 
    end 

    it "should allow items to be added" do 
    Foo.items << "kittens" 
    Foo.items.include?("kittens").should eq(true) 
    end 
end 

या हो सकता है एक बेहतर तरीका अपने वर्ग आंतरिक कहा गया है कि आप मैं परीक्षण करना चाहते हैं है, तो वर्ग

describe 'items' do 
    before(:each) do 
    Object.send(:remove_const, 'Foo') 
    load 'foo.rb' 
    end 

end 
+0

यह वर्ग स्तर पर एक @Variable है। यदि मैं 'पहले (प्रत्येक) 'का उपयोग करता हूं, तो डिफ़ॉल्ट में कोड बदल दिया जा सकता है और परीक्षणों पर ध्यान नहीं दिया जाएगा। –

+0

मेरा जवाब –

+0

अच्छा समाधान संपादित किया गया। मैं अपने कोड को और अधिक टेस्ट करने योग्य बनाने के बजाय कोड के लिए परीक्षण कार्य करने पर सुरंग दृष्टि से देखा गया था। ट्रैक पर वापस घूमने के लिए धन्यवाद! :) –

6

को फिर से लोड करने के लिए है:

यहाँ एक सरल उदाहरण है पाते हैं कि class_variable_get का उपयोग करने का एक अच्छा तरीका है। इस कक्षा में किसी भी चर का पर्दाफाश करने की आवश्यकता नहीं है, इसलिए कक्षा छूटे रह सकती है।

मुझे पता है कि यह आपके प्रश्न में नहीं है, लेकिन यह शीर्षक में है, जो मुझे यहां मिला है।

+0

अतिरिक्त के लिए धन्यवाद। आप सही हैं कि यह थोड़ा अलग है, लेकिन उम्मीद है कि यह उन लोगों की मदद करेगा जो इस पोस्ट को ढूंढते हैं और जो कुछ मैं हल कर रहा था उससे थोड़ा अलग कुछ ढूंढ रहा हूं। –

+0

बिल्कुल वही जो मैं खोज रहा था: डी धन्यवाद – gdurelle

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