2010-07-13 6 views
0

Скажем, у меня есть следующий метод:Как проверить вход пользователя из метода gets в ruby?

#Create new guest object. Add it to array and save it to disc 
    def new_guest 
    printf "First name: " 
    first_name = gets.chomp 
    printf "Last name: " 
    last_name = gets.chomp 
    printf "Adress: " 
    adress = gets.chomp 
    printf "Phone:" 
    phone = gets.chomp 
    new_guest = Guest.new(first_name, last_name, adress, phone) 
    @guests.push(new_guest) 
    File.open("guests", 'w') {|f| Marshal.dump(@guests, f) } 
    end 

Как бы я написать модульный тест для него, который может пройти в значениях для получает? Все, что я нашел, было this article, но я не знаю, как его использовать в этом случае. Im также интересно, есть ли хороший способ отметить вещи, которые не должны запускаться при запуске теста? Например, я бы не захотел сохранить фиктивные объекты.

+0

я собирался сделать предложение, но Думаю, я уже сделал это тебе в #ruby. Для всех, кто бродит, см. Этот пост в блоге для приятного прохода тестирования стандартного ввода/вывода в Ruby: http://technicalpickles.com/posts/a-pattern-for-using-standard-in-and-out -in-your-ruby-code/ – Telemachus

+0

Эта статья, с которой я связан в сообщении :) –

+0

Упс. Я читал слишком быстро. Прости, Патрик. – Telemachus

ответ

4

Причина, по которой вы пытаетесь протестировать этот метод, заключается в том, что метод делает слишком много. Этот метод собирает данные от пользователя, создает новый объект, добавляет запись в список и сохраняет его на диск. У вас есть пользовательский интерфейс, доступ к данным и постоянство объектов, все они завершены одним способом.

Попробуйте разделить метод на более мелкие методы, а затем проверьте их индивидуально. По крайней мере, вы могли бы иметь 2 метода следующим образом: -

def new_guest(first_name, last_name, address, phone) 
    guest = Guest.new(first_name, last_name, address, phone) 
    @guests.push(new_guest) 
    File.open("guests", 'w') {|f| Marshal.dump(@guests, f) } 
end 

def get_guest_data() 
    printf "First name: " 
    first_name = gets.chomp 
    printf "Last name: " 
    last_name = gets.chomp 
    printf "Adress: " 
    adress = gets.chomp 
    printf "Phone:" 
    phone = gets.chomp 
    [ first_name, last_name, address, phone] 
end 

Затем в тестовом модуле вы можете проверить new_guest путем передачи значений, полученных в ваших тестовых случаев

+0

Это очень верно, метод был в основном (плохим) примером, но ваш ответ заставил меня подумать, что, возможно, мне придется тестировать проверку ввода (чего нет в примере) вместо фактического ввода. Если я правильно его проверю, вход не имеет значения? –

+0

Ну, конечно, вы должны проверять любую проверку ввода, чтобы убедиться, что она делает правильную вещь для стандартных и краевых условий. Если у вас есть функция, которая также собирает входные данные, вы должны проверить эту функцию, убедившись, что данные собраны и переданы другой функции правильно, и ваша связанная статья имеет хорошие примеры того, как это сделать. –

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