Я совершенно новичок в Rspec, и это мой первый опыт тестирования вне рамки rails. Я просто пытаюсь понять, как я могу издеваться над поведением моего приложения, когда реализация довольно сложна.Как заглушить/выставить несколько опций в зависимости от ввода пользователем с помощью Rspec 3.4
Я хочу, чтобы иметь возможность имитировать поведение вызова customize_gender
ввода выбора и проверки того, что при вводе 1 результат «Мужской», когда 2 вводится результат является «Женщина» и т.д.
Я также хочу проверить, правильно ли задана переменная экземпляра @gender
, поэтому я добавил attr_reader :gender
. Я пробовал несколько вещей, но, я думаю, я не понимаю, как макеты в целом работают, чтобы найти решение. Я посмотрел на подобные вопросы, но они, похоже, не работают для моего сценария. Любое понимание очень ценится!
Главный файл (person.rb)
class Person
attr_reader :gender
GENDER = { male: 'Male', female: 'Female', other: 'Other'}
def initialize
puts customize_gender
end
def customize_gender
display_hash_option GENDER, 'What is your gender? '
choice = gets.chomp.to_i
@gender =
case choice
when 1
GENDER[:male]
when 2
GENDER[:female]
when 3
print 'Enter your preferred gender: '
gets.chomp.downcase
else
puts 'Error: Person -> customize_gender()'
end
end
private
def display_hash_option(hash, saying = '')
print saying
hash.each_with_index { |(key, _value), index| print "#{index.next}) #{key} " }
end
end
Rspec файла (спецификации/person_spec.rb)
require_relative "../person"
describe Person do
let(:person) { Person.new }
allow(Person).to receive(:gets).and_return(1,2,3)
person.customize_gender
expect(person.gender).to eq 'Male'
# allow(person).to receive(:customize_gender).and_return('Male')
# expect(Person).to receive(:puts).with('What is your gender?')
# allow(Person).to receive(:gets) { 1 }
# expect(person.gender).to eq 'Male'
end
Это работает для простых случаев, но как насчет вложенности попадает в предложение 'when 3'? Есть ли способ имитировать это? Я просто пытаюсь найти способ приспособить все крайние случаи элегантно. – Damian
Я понимаю, что вы имеете в виду, я скоро опубликую правку! –
Я имею в виду, что он должен работать в первом случае, когда пользователь вводит '3'. Но если пользователь входит 3, то сразу же ему предлагается ввести другой пол по своему выбору. поэтому, например, поток будет следующим: 'enter 3 -> enter 'other' -> result должно быть« other » – Damian