2016-06-10 3 views
1

Я совершенно новичок в 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 

ответ

1

Вот как вы могли бы сделать это, единственное, что издевались здесь является то, что gets установлен в '1' (помните, что это строка в этом случае, так как gets вход всегда является строкой)

RSpec.describe Person do 
    subject { Person.new } 

    it 'returns male as gender when male is chosen' do 
    allow(subject).to receive(:gets).and_return('1') 
    subject.customize_gender 

    expect(subject.gender).to eq('Male') 
    end 
end 

Для when 3 вы можете использовать следующие.

RSpec.describe Person do 
    subject { Person.new } 

    it 'returns other as gender when other has been entered' do 
    allow(subject).to receive(:gets).and_return('3', 'other') 
    subject.customize_gender 

    expect(subject.gender).to eq('other') 
    end 
end 
+0

Это работает для простых случаев, но как насчет вложенности попадает в предложение 'when 3'? Есть ли способ имитировать это? Я просто пытаюсь найти способ приспособить все крайние случаи элегантно. – Damian

+0

Я понимаю, что вы имеете в виду, я скоро опубликую правку! –

+0

Я имею в виду, что он должен работать в первом случае, когда пользователь вводит '3'. Но если пользователь входит 3, то сразу же ему предлагается ввести другой пол по своему выбору. поэтому, например, поток будет следующим: 'enter 3 -> enter 'other' -> result должно быть« other » – Damian

 Смежные вопросы

  • Нет связанных вопросов^_^