Проверить нулевые или отрицательные значения в помощниках?

Я написал следующую функцию rspec, чтобы проверить, равно ли введенное значение нулю или отрицательному значению:

require 'rails_helper'

RSpec.feature 'Users can create new credits' do

  before do
    visit credits_url
    click_link 'New Credit'
  end

  scenario 'with zero value' do
    fill_in 'Amount', with: 0.00
    click_button 'Create Credit'

    expect(page).to have_content 'Credit has not been created.'
  end

  scenario 'with negative value' do
    fill_in 'Amount', with: -100.00
    click_button 'Create Credit'

    expect(page).to have_content 'Credit has not been created.'
  end

end

Я думаю, чтобы пройти этот тест, мне нужно будет написать helpers/credit_helper.rb для этого, но не могу понять, с чего начать.

Может я ошибаюсь насчет помощников?


person Askar    schedule 27.09.2015    source источник
comment
ну, вам уже требуется rails_helper, почему бы не написать в нем простую функцию, которая принимает число или ввод (давайте назовем его num) и возвращает num === 0 || num > 0, которое вернет true, если это так, и false в противном случае? затем в тесте настройте условное выражение, которое выполняет код, который у вас есть, если возврат из вспомогательного метода истинен. ИЛИ вы можете просто установить это условное if num == 0 || num > 0 прямо в тесте. просто мысль.   -  person HolyMoly    schedule 27.09.2015
comment
@HolyMoly Я думаю, что то, что вы объяснили, может применяться только к тестовой стороне, и смогу ли я по-прежнему добавлять 0 или отрицательные значения в само приложение?   -  person Askar    schedule 27.09.2015
comment
это правда, но я думал, что вы просто проверяете, было ли введено значение, равное или меньше нуля. На стороне клиента вы, вероятно, можете добавить некоторую проверку в самой форме, если хотите предотвратить число меньше 1   -  person HolyMoly    schedule 27.09.2015
comment
Я делаю приложение, используя первый подход TDD/BDD. Я хотел бы иметь несколько четких примеров, как решить проблему.   -  person Askar    schedule 27.09.2015


Ответы (2)


Проблема решена с помощью следующей модели credit.rb:

class Credit < ActiveRecord::Base
  validates :amount, presence: true, numericality: { greater_than_or_equal_to: 1 }
end

Ссылка: https://stackoverflow.com/a/26257029/1745902

person Askar    schedule 27.09.2015

Хорошо вот подход, полностью непроверенный.

controller:

def create
 @payment = Payment.new(payment_params)
 amount=@payment(params[:amount])

  if (amount > 0)
     payment.save
  else 
     flash[:error] = 'Credit has not been created.'
  end

end

Это просто идея подхода. Вам нужно будет отобразить ошибку флэш-памяти на странице, используя что-то вроде:

<% if flash[:error] -%>
  <p ><%=h flash[:error] %></p>
<% end -%>

Это не помешает пользователю ввести сумму меньше 1, он просто проверяет ее и отображает «Кредит не был создан». контент, который, кажется, ищет ваш тест. Если вы хотите ПРЕДОТВРАТИТЬ это, то, как я уже сказал, вы можете выполнить некоторую проверку формы напрямую.

person HolyMoly    schedule 27.09.2015