2008-09-12 21 views
12

एक नियंत्रक विधि को देखते हुए:XML विधियों के लिए रेल एकीकरण परीक्षण कैसे सेट करें?

def show 
    @model = Model.find(params[:id]) 

    respond_to do |format| 
    format.html # show.html.erb 
    format.xml { render :xml => model } 
    end 
end 

एकीकरण परीक्षण लिखने का सबसे अच्छा तरीका क्या है जो दावा करता है कि रिटर्न में अपेक्षित एक्सएमएल है?

उत्तर

11

एकीकरण की परीक्षा में प्रारूप और assert_select का उपयोग करने का एक संयोजन अच्छा काम करता है:

class ProductsTest < ActionController::IntegrationTest 
    def test_contents_of_xml 
    get '/index/1.xml' 
    assert_select 'product name', /widget/ 
    end 
end 

अधिक जानकारी के लिए रेल डॉक्स में assert_select की जाँच करें।

0

सेट अनुरोध वस्तुओं को स्वीकार हैडर:

@request.accept = 'text/xml' # or 'application/xml' I forget which 

तो फिर तुम प्रतिक्रिया शरीर पर जोर कर सकते हैं कि आप क्या

assert_equal '<some>xml</some>', @response.body 
+0

वह भाग मुझे पता है, एक A..Z एकीकरण परीक्षण –

+1

कि assert_equal की तलाश में भी बहुत नाजुक है। तत्व या विशेषता आदेश की कोई गारंटी नहीं है; यदि यह बदलता है, तो आपका परीक्षण टूट जाएगा। लिटल स्ट्रिंग तुलना एक्सएमएल पेड़ों की समानता की जांच करने का सही तरीका नहीं है। – bjnord

5

उम्मीद कर रहे थे इस से एक्सएमएल प्रतिक्रिया के परीक्षण की मुहावरेदार तरीका है के बराबर है एक नियंत्रक

class ProductsControllerTest < ActionController::TestCase 
    def test_should_get_index_formatted_for_xml 
    @request.env['HTTP_ACCEPT'] = 'application/xml' 
    get :index 
    assert_response :success 
    end 
end 
+0

यह एक कार्यात्मक परीक्षण है, जो मेरे पास पहले से है। एकीकरण परीक्षण की तलाश में है। –

1

ये 2 उत्तर महान हैं, सिवाय इसके कि मेरे परिणामों में डेटाटाइम फ़ील्ड शामिल हैं, जो ज्यादातर परिस्थितियों में अलग होने के लिए गोंग हैं, इसलिए assert_equal विफल हो जाता है। ऐसा प्रतीत होता है कि मुझे एक XML पार्सर का उपयोग करके @response.body शामिल करने की आवश्यकता होगी, और फिर अलग-अलग फ़ील्ड, तत्वों की संख्या इत्यादि की तुलना करें या क्या कोई आसान तरीका है?

+0

हां; दिनांक और समय फ़ील्ड एक और कारण है कि assert_equal XML पेड़ों की तुलना करने का गलत तरीका क्यों है। मेरे लिए, मैंने अपने परीक्षण में समानता के लिए पूरी वस्तु की तुलना नहीं की है; मैंने विशिष्ट विशेषताओं के लिए assert_select (जैसा कि ntalbott दिखाया गया है) का उपयोग किया है। – bjnord

5

ntalbott का उत्तर एक क्रिया प्राप्त करता है। पोस्ट एक्शन थोड़ा सा ट्रिकियर है; यदि आप नई ऑब्जेक्ट को एक्सएमएल संदेश के रूप में भेजना चाहते हैं, और एक्सएमएल विशेषता नियंत्रक में पैरा हैश में दिखाई देती है, तो आपको हेडर सही मिलना होगा। यहाँ एक उदाहरण (रेल 2.3.x) है:

class TruckTest < ActionController::IntegrationTest 
    def test_new_truck 
    paint_color = 'blue' 
    fuzzy_dice_count = 2 
    truck = Truck.new({:paint_color => paint_color, :fuzzy_dice_count => fuzzy_dice_count}) 
    @headers ||= {} 
    @headers['HTTP_ACCEPT'] = @headers['CONTENT_TYPE'] = 'application/xml' 
    post '/trucks.xml', truck.to_xml, @headers 
    #puts @response.body 
    assert_select 'truck>paint_color', paint_color 
    assert_select 'truck>fuzzy_dice_count', fuzzy_dice_count.to_s 
    end 
end 

आप यहाँ देख सकते हैं कि 2 तर्क पोस्ट करने के लिए एक पैरामीटर हैश होने के लिए नहीं है, यह एक स्ट्रिंग (एक्सएमएल युक्त) हो सकता है, यदि हेडर सही हैं। तीसरा तर्क, @ हेडर, वह हिस्सा है जिसने मुझे पता लगाने के लिए बहुत सारे शोध किए।

(नोट भी to_s का उपयोग, जब assert_select में एक पूर्णांक मूल्य की तुलना।)

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