Nano Hash - криптовалюты, майнинг, программирование

Запуск минитеста на hanami 1.0.0 каким-то образом искажает данные в контроллере

У меня есть контроллер:

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

У меня есть спец тест:

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: я должен сказать, что 'REQUEST_METHOD' => 'GET' был просто удачным предположением, чтобы заставить его работать.

Хорошо. Когда я отлаживаю значения с помощью action.show(value), я получаю именно то, что ожидалось: session[:person_data_validated] = true и params[: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])

to

redirect_to routes.path(:person, 1)

все работает нормально.

Мы можем опустить, что эта строка кода даже не должна выполняться из-за условия session[:person_data_validated].

Помоги мне понять мою слепоту и преодолеть ее. Как заставить это работать?

EDIT: я забыл включить файл params QuizValidation в контроллер (теперь он включен) со следующими правилами проверки:

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

С этим закомментированным файлом я не получаю ошибку, но я все еще захожу внутрь if, так что redirect_to routes.path(:person, params[:quiz_id]) выполняется.

16.09.2017

Ответы:


1

Параметр маршрутизатора должен быть передан как обычный параметр, а затем он может быть проверен по правилам params. Объявление сеанса показано ниже.

let(:params) { Hash[
  person: {},
  'REQUEST_METHOD' => 'GET',
  quiz_id: 1,
  'rack.session' => { person_data_validated: true }
]}
17.09.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..