2009-12-18 14 views
8

साथ परीक्षण नियंत्रक उदाहरण चर मुझे लगता है कि के रूप में केवल पढ़ने के लिए या संपादन योग्य के आधार पर पृष्ठों में कार्य करता है, तो उपयोगकर्ता के प्रवेश एक सिनात्रा एप्लिकेशन है।रैक :: टेस्ट और सिनात्रा

नियंत्रक सेट एक चर @can_edit, वह यह है कि संपादन लिंक छुपाने/दिखाने के लिए विचारों द्वारा उपयोग किया जाता है। मैं अपने परीक्षणों में @can_edit के मूल्य का परीक्षण कैसे कर सकता हूं? मुझे नहीं पता कि रैक :: टेस्ट के तहत नियंत्रक के वर्तमान उदाहरण को कैसे प्राप्त किया जाए।

मैं class_eval का उपयोग नियंत्रक में logged_in? विधि ठूंठ, लेकिन मैं अपने लिंक संपादन के लिए last_response.body जाँच देखने के लिए अगर @can_edit स्थापित किया गया है या नहीं का सहारा लेना हो रही है।

मैं @can_edit के मूल्य का परीक्षण कैसे कर सकता हूं?

उत्तर

8

दुर्भाग्य से मुझे नहीं लगता कि यह रैक :: टेस्ट को संशोधित किए बिना संभव है। जब आप आवेदन के परीक्षण के दौरान एक अनुरोध बनाने के लिए, रैक :: टेस्ट निम्नलिखित है:

  1. आपके आवेदन का एक नया उदाहरण बनाता है और अपने call विधि invokes हाल अनुरोध की एक सूची के लिए अनुरोध कहते हैं
  2. हाल ही में प्रतिक्रियाओं की एक सूची

यह तक पहुंचना आसान है करने के लिए अपने आवेदन की प्रतिक्रिया कहते हैं last_request और last_response, लेकिन जब यह runni है दुर्भाग्य से कोई जानकारी अपने आवेदन की स्थिति के बारे में सहेजा जाता है एनजी।

यदि आप इसे करने के लिए एक रैक :: टेस्ट पैच को एक साथ हैक करने में रुचि रखते हैं, तो लाइन 30 पर rack-test/lib/rack/mock_session.rb को देखकर शुरू करें। यह वह जगह है जहां रैक :: टेस्ट आपके एप्लिकेशन को चलाता है और मानक रैक ऐप रिटर्न मान प्राप्त करता है (स्थिति, शीर्षलेख, शरीर)। मेरा अनुमान है कि आपको अपने सभी इंस्टॉलेशन चरों को एकत्रित करने और पहुंचाने के लिए, अपने एप्लिकेशन को भी संशोधित करना होगा।

किसी भी मामले में, परिणामों के परीक्षण के लिए सबसे अच्छा है, कार्यान्वयन विवरण नहीं।

assert last_response.body.match(/<a href="..." id="...">/) 
+0

"परिणाम के लिए परीक्षण करना सबसे अच्छा है, कार्यान्वयन विवरण नहीं है" मैंने पहले इस तरह के बयान देखे हैं, और मुझे असहमत होना है। यदि आप 2 चाहते हैं, 1 + 1 काफी अच्छी तरह से काम करता है, लेकिन 1 + 2 + 10 - 11. ऐसा भी नहीं है जिसका मतलब है कि आपका एप्लिकेशन "वास्तव में ठीक से काम कर रहा है"। – nowk

+1

मैं आपसे पूरी तरह से असहमत नहीं हूं, हालांकि: मान लें कि एक विधि है जो गलत तरीके से लागू की गई है।यदि विधि सही उत्तर देता है तो 100% समय (आप उस मामले के बारे में नहीं सोच सकते जहां यह विफल हो जाता है) तो क्या कार्यान्वयन वास्तव में "गलत है?" फर्क पड़ता है क्या? यदि आप स्वयं विधियों के चर के मूल्यों का परीक्षण करते हैं, तो आपके पास पर्याप्त परीक्षण मामले (इनपुट) नहीं हो सकते हैं। यदि आप चर का नाम बदलते हैं या अन्यथा अपने व्यवहार को बदलने के बिना अपने आवेदन के कार्यान्वयन को बदलते हैं, तो आपके परीक्षण बिना किसी संशोधन के पास हो सकते हैं। यह पहली जगह में परीक्षणों का उपयोग करने का एक बड़ा कारण है। –

+0

मुझे लगता है कि @can_edit परीक्षण नियंत्रक के आउटपुट का परीक्षण कर रहा है। मैं @can_edit सेट होने पर क्या होना चाहिए इसके लिए दृश्य की जांच करके अप्रत्यक्ष रूप से परीक्षण करना पसंद नहीं करता। यह पूरी तरह से देखने के लिए, एक अलग परीक्षण होना चाहिए। – Brian

4

यह थोड़ा हैक के साथ संभव है: यदि आप बनाना चाहते हैं यकीन है कि एक संपादित करें लिंक नहीं दिखाई, डोम आईडी द्वारा संपादित करें लिंक की उपस्थिति के लिए परीक्षण है। सिनात्रा ऐप के उदाहरण अनुपलब्ध हैं क्योंकि वे सिनात्रा :: बेस # कॉल कहलाते समय बनाए जाते हैं। जैसा कि एलेक्स ने समझाया। यह हैक आगे एक उदाहरण तैयार करता है और अगली कॉल इसे पकड़ लेता है।

require 'something/to/be/required' 

class Sinatra::Base 
    @@prepared = nil 

    def self.onion_core 
    onion = prototype 
    loop do 
     onion = onion.instance_variable_get('@app') 
     return onion if onion.class == self || onion.nil? 
    end 
    end 

    def self.prepare_instance 
    @@prepared = onion_core 
    end 

    # Override 
    def call(env) 
    d = @@prepared || dup 
    @@prepared = nil 
    d.call!(env) 
    end 
end 

describe 'An Sinatra app' do 
    include Rack::Test::Methods 

    def app 
    Sinatra::Application 
    end 

    it 'prepares an app instance on ahead' do 
    app_instance = app.prepare_instance  
    get '/foo' 
    app_instance.instance_variable_get('@can_edit').should be_true 
    end 
end 

मैं पहली जगह में mock the instance that runs the current test के लिए इस तकनीक पता लगा।

+0

यह मेरे लिए nil app_instance देता है। शायद नवीनतम सिनात्रा ने अपनी बेस क्लास बदल दी। – gpavlidi

0

उसके बारे में यहां बुरा लेकिन व्यवहार्य विकल्प

# app.rb - sets an instance variable for all routes 
before do 
    @foo = 'bar' 
end 

# spec.rb 
it 'sets an instance variable via before filter' do 
    my_app = MySinatraApplication 
    expected_value = nil 
    # define a fake route 
    my_app.get '/before-filter-test' do 
    # as previously stated, Sinatra app instance isn't avaiable until #call is performed 
    expected_value = @foo 
    end 
    my_app.new.call({ 
    'REQUEST_METHOD' => 'GET', 
    'PATH_INFO' => '/before-filter-test', 
    'rack.input' => StringIO.new 
    }) 
    expect(expected_value).to eq('bar') 
end 

यह आपको पहले आधार आवेदन के लिए बनाया फिल्टर और या उपयोग उदाहरण चर एक सिनात्रा के खिलाफ परीक्षण करने के लिए अनुमति देता है।

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

  • कोई संबंधित समस्या नहीं^_^