2011-11-26 21 views
22

यह मेरा कार्रवाई है:एक JSON नियंत्रक इकाई-परीक्षण कैसे करें?

def my_action 
    str = ... # get json str somehow 
    render :json => str 
end 

यह मेरी परीक्षा है:

test "my test" do 
    post(:my_action, {'param' => "value"}  
    assert_response :success 
end 

मैं एक और जोर जोड़ने के लिए है कि उत्सर्जित JSON कुछ मान चाहते हैं। मैं इसे नियंत्रक इकाई-परीक्षण में कैसे कर सकता हूं, दृश्य परिणाम को पारदर्शी नहीं कर सकता?

+1

जेसन प्रतिक्रिया को पार्स करना सबसे आसान तरीका नहीं होगा? – jdeseno

+0

मैं इस धारणा के तहत था कि यूनिट परीक्षण वास्तव में दृश्य को नहीं बुलाता है। क्या यह मामला है? यदि हां, तो किस प्रकार का परीक्षण मैं देखता हूं (देखें?) –

+1

मेरा मानना ​​है कि इस प्रश्न पर पहले से ही चर्चा की गई थी [यहां] (http://stackoverflow.com/questions/336716/how-to-test-json-result-from -rails कार्यात्मक परीक्षण)। आप जो कर रहे हैं वह यूनिट नहीं है, लेकिन कार्यात्मक परीक्षण है। और यह वास्तव में दृश्य प्रस्तुत करता है। –

उत्तर

43

जैसे लोगों ने ऊपर टिप्पणी की, यह एक कार्यात्मक परीक्षण होगा।

सबसे अच्छा तरीका शायद अनुरोध कर रहा है, जेएसओएन प्रतिक्रिया निकाय को पार्स कर रहा है, और अपेक्षित परिणाम से मेल खाता है।

अगर मैं FactoryGirl का उपयोग कर Rspec में companies_controller है:

describe "GET 'show'" do 

    before(:each) do 
    @company = Factory(:company) 
    get 'show', :format => :json, :id => @company.id 
    end 

    it "should be successful" do 
    response.should be_success 
    end 

    it "should return the correct company when correct id is passed" do 
    body = JSON.parse(response.body) 
    body["id"].should == @company.id 
    end 

end 

आप अन्य परीक्षण कर सकते हैं उसी तरह जिम्मेदार बताते हैं। इसके अलावा, मेरे पास आमतौर पर invalid संदर्भ है जहां मैं अमान्य पैरामीटर को पारित करने का प्रयास करूंगा।

+0

फैक्टरीगर्ल को मॉडल की आवश्यकता नहीं है, इसलिए आपके उदाहरण में, आपके पास "कंपनी" के लिए एक मॉडल होना चाहिए? – Ninja

+0

आपने अपना दिन आदमी बचाया। बहुत बहुत धन्यवाद। – Abhinay

15

रेल 'में निर्मित कार्यात्मक परीक्षण का उपयोग करना:

require 'test_helper' 

class ZombiesControllerTest < ActionController::TestCase 

    setup do 
    @request.headers['Accept'] = Mime::JSON 
    @request.headers['Content-Type'] = Mime::JSON.to_s 

    end 

    test "should post my action" do 
    post :my_action, { 'param' => "value" }, :format => "json" 
    assert_response :success 
    body = JSON.parse(response.body) 
    assert_equal "Some returned value", body["str"] 
    end 

end 
+0

यह तब काम करता है जब आपके पास एक प्रतिक्रिया_to फ़ंक्शन होता है जो अलग-अलग ब्लॉक के आधार पर अलग-अलग डेटा देता है .. ऊपर दिए गए उदाहरण में, पोस्टर उस विधि को परिभाषित करता है जिसमें सही प्रतिसाद_to ब्लॉक को ट्रिगर करने के लिए अनुरोधकर्ता को अनुरोध भेजा जाता है। – FlyingV

3

इस मेरे दृष्टिकोण अगर मैं Jbuilder मणि अब रेल टीम से उपलब्ध है कि उपयोग कर रहा हूँ थोड़ी अलग है। (यह दृष्टिकोण अन्य रत्नों पर लागू होता है जो JSON या XML को विचार के रूप में प्रस्तुत करते हैं।) जब भी संभव हो, मैं कार्यात्मक परीक्षणों पर इकाई परीक्षण पसंद करता हूं, क्योंकि वे काफी तेज़ हो सकते हैं। जेबिल्डर के साथ आप अधिकांश परीक्षणों को यूनिट परीक्षणों में बदल सकते हैं।

हां, आपके पास अभी भी नियंत्रक पर कार्यात्मक परीक्षण हैं, लेकिन बहुत कम हैं और वे JSON को पार्स नहीं करते हैं। कार्यात्मक परीक्षण पूरी तरह से नियंत्रक तर्क का परीक्षण करता है, न कि प्रस्तुत JSON। एक वैध अनुरोध के बाद (RSpec) पर जोर हो सकता है के लिए एक कार्यात्मक परीक्षण:

assert_response :success 
    expect(response).to render_template(:show) 
    expect(assigns(:item).id).to eq(expected_item.id) 

मैं बस की पुष्टि करने कर रहा हूँ यह सफल हुआ है कि, यह टेम्पलेट प्रस्तुत हुई है, और यह टेम्पलेट के लिए मद से गुजरता है। इस बिंदु पर, दृश्य में उचित प्रतिपादन करने के लिए आवश्यक जानकारी होती है।

अब जेबिल्डर दृश्य को परीक्षण करने वाले यूनिट द्वारा प्रदान किए गए JSON का परीक्षण करें।

describe 'api/v1/items/show.json.jbuilder' do 
    it 'includes foo' do 
    assign(:item, account.build(foo: 'bar')) 

    render 

    json = JSON.parse(rendered) 
    expect(json['item']['foo']).to eq('bar') 
    end 

    # A bunch of other JSON tests... 
1

इस नियंत्रक परीक्षण मेरे लिए अच्छी तरह से काम रेल 4.2.4 के साथ Minitest का उपयोग कर:

require 'test_helper' 

class ThingsControllerTest < ActionController::TestCase 

    test "should successfully create a new thing" do 
    assert_difference 'Thing.count' do 
     @request.headers["Accept"] = "application/json" 

     post(:create, {thing: {name: "My Thing"}}) 
    end 

    assert_response :success 

    json_response = JSON.parse(@response.body) 
    assert_equal json_response["name"], "My Thing" 
    end 

end 

और इस एकीकरण के परीक्षण के रूप में काम किया।

require 'test_helper' 

class ThingsRequestsTest < ActionDispatch::IntegrationTest 

    test "creates new thing" do 
    assert_difference 'Thing.count' do 
     post("/things.json", {thing: { name: "My Thing"}}) 
    end 

    assert_equal 201, status 

    json_response = JSON.parse(@response.body) 
    assert_equal json_response["name"], "My Thing" 
    end 

end 

ईमानदारी से, सिंडैक्टिकल बारीकियों को सीधे एक प्रकार के परीक्षण से दूसरे में रखने की कोशिश करना अजीब है।

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