2010-05-21 11 views
13

मैं एक सिनात्रा ऐप लिख रहा हूं और इसे आरएसपीईसी और रैक/टेस्ट (जैसा कि sinatrarb.com पर वर्णित है) के साथ परीक्षण कर रहा हूं।
यह अब तक बहुत अच्छा रहा है, जब तक कि मैंने अपने डोमेन ऑब्जेक्ट्स से सिनात्रा हेल्पर्स तक कुछ प्रक्रियात्मक कोड स्थानांतरित नहीं किया।रुपयेपेक का उपयोग करके, सिनात्रा में हेल्पर्स ब्लॉक का परीक्षण कैसे कर सकता हूं?

तब से, मैं यह पता लगाने की कोशिश कर रहा हूं कि अलगाव में इनका परीक्षण कैसे किया जाए?

उत्तर

6

वास्तव में आप क्या करने की जरूरत नहीं है मदद कर सकते हैं: चूंकि आप सिर्फ

helpers FooBar 

कॉल कर सकते हैं

helpers do 
    include FooBar 
end 

helpers विधि एक सूची लेता है मॉड्यूल के मिश्रण और एक वैकल्पिक ब्लॉक जो वर्ग-eval'd है: https://github.com/sinatra/sinatra/blob/75d74a413a36ca2b29beb3723826f48b8f227ea4/lib/sinatra/base.rb#L920-L923

0

मैं भी इस की कोशिश की है अपने परिवेश से प्रत्येक सहायक को अलग करने के लिए (जो पुन: प्रयोज्य होने के लिए थोड़ा साफ होने की जरूरत है) परीक्षण किया जाना:

class SinatraSim 
    def initialize 
    ...set up object here... 
    end 
end 

def helpers(&block) 
    SinatraSim.class_eval(&block) 
end 

require 'my/helper/definition' # defines my_helper 

describe SinatraSim do 
    subject { SinatraSim.new(setup) } 

    it "should do something" 
    subject.expects(:erb).with(:a_template_to_render) # mocha mocking 
    subject.my_helper(something).should == "something else" 
    end 
end 
12

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

यदि आप त्वरित डेमो लिखते हैं, और आप helpers { ... } ब्लॉक के भीतर अपने सहायक तरीकों को परिभाषित करते हैं, तो मुझे नहीं लगता कि यह परीक्षण बिल्कुल जरूरी है। उत्पादन में कोई भी sinatra ऐप, वैसे भी अधिक मॉड्यूलरिटी की आवश्यकता हो सकती है।

# in helpers.rb 
module Helpers 
    def safe_json(string) 
    string.to_s.gsub(/[&><']/) { |special| {'&' => '\u0026', '>' => '\u003E', '<' => '\u003C', "'" => '\u0027'}[special] } 
    end 
end 

# in app.rb 
helpers do 
    include Helpers 
end 

# in spec/helpers_spec.rb 
class TestHelper 
    include Helpers 
end 

describe 'Sinatra helpers' do 
    let(:helpers) { TestHelper.new } 

    it "should escape json to inject it as a html attribute" 
    helpers.safe_json("&><'").should eql('\u0026\u003E\u003C\u0027') 
    end 
end