我如何测试ruby中gets方法的用户输入?

时间:2010-07-13 16:10:54

标签: ruby unit-testing

说我有以下方法:

#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

我如何编写一个可以传入gets值的单元测试? 我发现的只有this article,但在这种情况下我不知道如何使用它。 我还想知道是否有一种很好的方法来标记从测试运行时不应该运行的东西?我可能不想保存虚拟对象。

1 个答案:

答案 0 :(得分:4)

您正在努力测试此方法的原因是因为该方法做得太多了。此方法从用户收集输入,创建新对象,将记录添加到列表并将其保存到磁盘。您将UI,数据访问和对象持久性全部包含在一个方法中。

尝试将方法拆分为较小的方法,然后单独测试。至少你可以有两种方法: -

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