2017-09-16 16 views
1

内のデータを破損何とか花見1.0.0上で実行します。Minitest私はコントローラ持ちコントローラ

require 'spec_helper' 
require_relative '../../../../apps/web/controllers/quiz/test' 

describe Web::Controllers::Quiz::Test do 
    let(:action) { Web::Controllers::Quiz::Test.new } 
    let(:params) { Hash[person: {}, quiz_id: 1] } 
    let(:repository) { QuizRepository.new } 
    let(:session) { Hash.new } 

    before do 
    # repository things 
    end 

    describe 'reloading page [GET]' do 
    let(:params) { Hash[person: {}, quiz_id: 1, 'REQUEST_METHOD' => 'GET'] } 

    it 'reloads current state if person data validated' do 
     session[:person_data_validated] = true 

     response = action.call(params) 
     # there I debug values of minitest 
     action.show(params[:quiz_id]).must_equal 'test' 

     response[0].must_equal 200 
    end 
    end 
end 

PS:私はスペックのテストを持っている

module Web::Controllers::Quiz 
    class Test 
    include Web::Action 
    params QuizValidation 

    def show(thing) 
     thing 
    end 

    def call(params) 
     if request.get? 
     unless session.has_key?(:person_data_validated) && session[:person_data_validated] 
      redirect_to routes.path(:person, params[:quiz_id]) 
     end 
     end 
    end 

    end 
end 

を私は'REQUEST_METHOD' => 'GET'がちょうどあったと言うべきそれを動作させる幸運な推測。

大丈夫です。私がaction.show(value)で値をデバッグするとき、私は期待されるものを正確に得る:session[:person_data_validated] = trueparams[:quiz_id] = 1

しかし、私は実際にこのテストを実行すると、それはエラーを出力します。

Web::Controllers::Quiz::Test::reloading page [GET]#test_0002_reloads current state if person data validated: 
Hanami::Routing::InvalidRouteException: No route (path) could be generated for :person - please check given arguments 

わかりました。私は明示的にコントローラにこのラインを設定した場合:

redirect_to routes.path(:person, params[:quiz_id])

redirect_to routes.path(:person, 1)

にすべてが正常に動作します。

このコード行は、session[:person_data_validated]の条件のために実行しないでください。

私の失明を理解し、それを克服するのに役立ちます。それを動作させるには?

編集:私はエラーを取得しないコメントアウトが、私

module Web::Controllers::Quiz 
    class QuizValidation < Web::Action::Params 

    # arrays of described values 
    REGIONS = ::I18n.t "web.quiz.person.regions" 
    QUIZ_LANGUAGE_LEVELS = ::I18n.t "web.quiz.person.quiz_language_levels" 
    LANGUAGES = ::I18n.t "languages" 

    params do 
     required(:person).schema do 
     optional(:sex).filled(:str?, included_in?: ['male', 'female']) 
     optional(:age).filled(:int?, included_in?: 1..100) 
     optional(:profession).filled(:str?) 
     optional(:region).filled(:str?, included_in?: REGIONS) 
     optional(:residence_place).filled(:str?) 
     optional(:birth_place).filled(:str?) 
     optional(:nationality1).filled(:str?) 
     optional(:nationality2).filled(:str?) 
     optional(:spoken_languages).filled(:int?, included_in?: 1..100) 
     optional(:native_language).filled(:str?, included_in?: LANGUAGES) 
     optional(:communication_language).filled(:str?, included_in?: LANGUAGES) 
     optional(:education_language).filled(:str?, included_in?: LANGUAGES) 
     optional(:quiz_language_level).filled(:str?, included_in?: QUIZ_LANGUAGE_LEVELS) 
     end 
    end 
    end 
end 

このファイルを使用して:私は次の検証ルール(今梱)コントローラにparams QuizValidationファイルを含めるのを忘れて まだifの中に入り、redirect_to routes.path(:person, params[:quiz_id])が実行されます。

答えて

0

通常のパラメータとしてルータのパラメータを渡してから、paramsの規則で検証することができます。セッション宣言を以下に示します。

let(:params) { Hash[ 
    person: {}, 
    'REQUEST_METHOD' => 'GET', 
    quiz_id: 1, 
    'rack.session' => { person_data_validated: true } 
]}