6

मेरे पास before_filter है ApplicationController कक्षा पर और मैं इसके लिए एक परीक्षण लिखना चाहता हूं? मुझे इस परीक्षा को कहां लिखना चाहिए? मैं हर सबक्लास नियंत्रक परीक्षण फ़ाइल में नहीं जाना चाहता हूं और इस फ़िल्टर के बारे में परीक्षण दोहराता हूं।रेल 3 में फिल्टर विधियों से पहले एप्लिकेशन नियंत्रक का परीक्षण कैसे करें?

इसलिए, ApplicationController पहले_फिल्टर का परीक्षण करने का अनुशंसित तरीका क्या है?

ध्यान दें कि मैं minitest के साथ उपयोग कर रहा हूं।

उत्तर

5

मेरा मामला आपके से थोड़ा अलग है, लेकिन मुझे साइट पर (टेवीस के साथ) परीक्षण प्रमाणीकरण के समान कुछ करने की आवश्यकता है। यहाँ कैसे मैंने किया है:

# application_controller.rb 
class ApplicationController < ActionController::Base 
    before_filter :authenticate_user! 
end 

# application_controller_test.rb 
require 'test_helper' 

class TestableController < ApplicationController 
    def show 
    render :text => 'rendered content here', :status => 200 
    end 
end 

class ApplicationControllerTest < ActionController::TestCase 
    tests TestableController 

    context "anonymous user" do 
    setup do 
     get :show 
    end 
    should redirect_to '/users/sign_in' 
    end 
end 

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

0

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

class Controller < ApplicationController 
    before_filter :load_resource, :only => [:show, :edit] 

    def show 
    end 

    def edit 
    end 

    def index 
    end 

    ######### 
    protected 
    ######### 

    def load_resource 
    @resource = Model.find(params[:id]) 
    end 
end 

मैं साधारण परीक्षण #show कि होता है और #edit @resource बात आवंटित। यह सरल परिदृश्यों के लिए बहुत काम करता है। यदि फिल्टर कई क्रियाओं/नियंत्रकों पर लागू होता है तो आप परीक्षण कोड निकाल सकते हैं और परीक्षणों में इसका पुन: उपयोग कर सकते हैं।

+0

, मैं अपने दृष्टिकोण के साथ सहमत हैं। मेरा फ़िल्टर 'एप्लिकेशन कंट्रोलर' वर्ग पर घोषित किया गया है (और इससे प्राप्त सभी नियंत्रकों को विरासत में मिला है)। मैं जिस फ़िल्टर विधि का उपयोग करता हूं उसे अनुरोध पर चेक के साथ करना होता है। मुझे एक ऐसे स्थान पर एक परीक्षा लिखनी है जहां मैं एक कंक्रीट नियंत्रक का परीक्षण करते समय उपयोग (या समतुल्य?) जैसी विधियों का उपयोग कर सकता हूं। हो सकता है कि मेरी समस्या का आपका उत्तर आपके अंतिम वाक्यांश में है ("अगर फिल्टर ... परीक्षणों में ...", लेकिन मैं इसे नहीं देख सकता। साथ ही, मैं कैसे परीक्षण करूं कि 'pre_filter' से जुड़ी विधि वास्तव में उससे जुड़ी हुई है? –

+1

आप एक परीक्षण सूट लिख सकते हैं जो प्रत्येक नियंत्रक परीक्षण में शामिल हो जाता है और प्रत्येक क्रिया के लिए चलता है। यह 'it_behaves_like' (https: // www का उपयोग करके आरएसपीईसी का उपयोग करने के लिए सरल (आर) होना चाहिए।relishapp.com/rspec/rspec-core/v/2-0/docs/example-groups/shared-example-group) बात, लेकिन सरल टेस्ट :: यूनिट पर आप ऐसी चीजें कर सकते हैं। हो सकता है कि आप ActiveModel :: लिंट: टेस्ट से प्रेरणा ले सकें (http://api.rubyonrails.org/classes/ActiveModel/Lint/Tests.html - https://github.com/rails/rails/blob/master/activemodel /lib/active_model/lint.rb) –

1

अब मुझे विश्वास है कि मुझे अपने सभी नियंत्रकों को पहले_फिल्टर अस्तित्व के बारे में परीक्षण परीक्षण करना होगा और यह फ़िल्टर अपेक्षा के अनुसार काम करता है। ऐसा इसलिए है क्योंकि, मुझे नहीं पता कि नियंत्रक skip_before_filter का उपयोग करता है या नहीं।

इसलिए, मैंने यह सुनिश्चित करने के लिए mock (@controller.expects(:before_filter_method)) का उपयोग करने का निर्णय लिया है कि फ़िल्टर कहलाता है। तो, उदाहरण के लिए, एक index कार्रवाई में मैं अपने परीक्षण में लिखें:

test "get index calls the before filter method" do 
    @controller.expects(:before_filter_method) 
    # fire 
    get :index  
end 

यह यकीन है कि मेरी नियंत्रक कॉल before_filter_method विशेष कार्रवाई पर कर देगा। मुझे अपने सभी कार्यों के परीक्षणों पर ऐसा करना है।

यदि किसी और के पास बेहतर समाधान है, तो मुझे बताएं।

+0

आप बस उस फ़िल्टर के साथ या उसके बिना क्या होगा इसके लिए परीक्षण क्यों नहीं करते? इस तरह आप फ़िल्टर से decoupled हैं और केवल देखभाल * फिल्टर * कहा जाता है, क्या होता है, यह नहीं कहा जाता है कि यह कहा जाता है या नहीं। इसका अतिरिक्त लाभ यह है कि आप फ़िल्टर का नाम बदल सकते हैं, इसका दायरा बदल सकते हैं, इसे किसी अन्य वर्ग में ले जा सकते हैं, या इसे पर्यवेक्षक, सेवा, या आपके पास क्या बदल सकते हैं। –

2

@bmaddy answser पर सुधार करने के लिए, आपको चश्मा चलाने के लिए रूटिंग सेट करने की आवश्यकता है।

यहाँ एक रेल 5 कार्य उदाहरण है: फिल्टर एक विशिष्ट नियंत्रक पर है, तो

require 'test_helper' 

class BaseController < ApplicationController 
    def index 
    render nothing: true 
    end 
end 

class BaseControllerTest < ActionDispatch::IntegrationTest 
    test 'redirects if user is not logedin' do 
    Rails.application.routes.draw do 
     get 'base' => 'base#index' 
    end 

    get '/base' 

    assert_equal 302, status 
    assert_redirected_to 'http://somewhere.com' 
    Rails.application.routes_reloader.reload! 
    end 

    test 'returns success if user is loggedin' do 
    Rails.application.routes.draw do 
     get 'base' => 'base#index' 
    end 

    mock_auth! 

    get '/base' 
    assert_equal 200, status 
    Rails.application.routes_reloader.reload! 
    end 
end 
संबंधित मुद्दे