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

RSpec - Как проверить блок if-else в методе обновления контроллера

Допустим, у меня есть база данных для хранения данных о людях (имя, адрес электронной почты). И в контроллере есть метод обновления. Метод такой:

  def update
    @people = People.find(params[:id])
    if @people.update(people_params)
       redirect_to people_path
    else
       render 'edit'
    end
  end

Интересно, как можно протестировать ситуацию, что обновление не удалось? Или мне действительно нужно проверить это? Я искал его в StackOverflow, есть ссылка об этом, но там не сказано если я должен или не должен проверить это. Может ли кто-нибудь помочь мне в этом? Если это можно проверить, то как? Большое спасибо!


  • Есть ли у вас проверка модели People? Поделитесь кодом модели. 10.04.2020

Ответы:


1
  1. Вам не нужно тестировать внутренности Ruby и Rails. Либо вы верите, что оба они работают должным образом, либо вам лучше переключиться на какой-то другой язык/фреймворк.

  2. Если вы все еще хотите проверить это, издевайтесь над всем, что не связано. Вот пример того, как это сделать с rspec и flexmock.

describe '#update' do
  let(:person) { build(:people) }
  before do
    flexmock(People).should_receive(:find).once.returns person
    flexmock(person).should_receive(:update).once.returns false
  end

  it 'redirects to `edit` page' do
    ...
  end
end
10.04.2020
  • Я согласен, что он не должен тестировать внутренности рельсов, но теоретически он должен тестировать поведение, нет? перенаправление, если обновление прошло успешно, и рендеринг, если это не так. 10.04.2020
  • Это проверка того, работает ли if должным образом. Оно делает. Я клянусь. 10.04.2020
  • что в коде ошибка и он перенаправляет_на peple_path вместо people_path? вы говорите, что это не должно быть покрыто .. 10.04.2020
  • @Joel_Blum Что, если в своем тесте вы сделаете та же ошибка и peple_path тоже будет существовать? Существует граница между здравым смыслом и 100% охватом. Я не защищаю это, и мой ответ показывает, как на самом деле это можно проверить. Лично я бы не стал тратить время на создание таких тестов. 10.04.2020
  • лол, если peple_path также существует И тест делает ту же ошибку, мы действительно немного застряли. хотя вряд ли :) 10.04.2020
  • Я понимаю, что здесь я исключение, но иногда я заканчиваю тем, что тестирую внутренности Rails, просто чтобы убедиться, что мое понимание того, как они работают, соответствует тому, как они работают. Я не слишком умен, поэтому я часто ошибаюсь! Я сплю лучше, когда проверяю, а не предполагаю, что знаю, как это работает. 11.04.2020

  • 2

    Обычно сбой обновления происходит из-за того, что сохраняемый объект недействителен в соответствии с его критериями проверки. Обычно вы проверяете критерии проверки в спецификациях модели, но при тестировании контроллера или в интеграционных тестах вы можете убедиться, что рендеринг #edit происходит, когда пользователь пытается сохранить недопустимую модель.

    Если модель не имеет каких-либо критериев проверки, вы, вероятно, можете вообще пропустить else render :edit. Это часть основы Rails, которая может применяться не во всех случаях.

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

    Нет правильного или неправильного относительно того, следует ли тестировать. Лично я бы протестировал его, потому что мне нравится TDD, и я предпочитаю перетестировать, а не недотестировать. Многие бы этого не сделали.

    11.04.2020
    Новые материалы

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

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

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

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

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

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

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