2013-06-23 26 views
6

Wyzwanie

Witam! W przypadku następującej metody Ruby, jak mogę symulować wprowadzanie danych przez użytkownika przy użyciu testu RSpec bez przepisywania metody?Jak napisać test RSpec dla metody Ruby, która zawiera "gets.chomp"?

def capture_name 
    puts "What is your name?" 
    gets.chomp 
end 

Znalazłem a similar question, ale takie podejście wymaga stworzenia za pomocą klasy. Czy RSpec obsługuje stubbing dla metod spoza klasy?

innego dzieła, ale jestem zmuszony do przerobienia metoda

mogę przepisać metodę więc ma zmienną o wartości domyślnej „gets.chomp” jak to:

def capture_name(user_input = gets.chomp) 
    puts "What is your name?" 
    user_input 
end 

teraz mogę napisać test rspec takiego:

describe "Capture name" do 
    let(:user_input) { "James T. Kirk" } 

    it "should be 'James T. Kirk'" do 
    capture_name(user_input).should == "James T. Kirk" 
    end 
end 
+4

http://stackoverflow.com/questions/4609872/rspec-commandline-variable-input – ahmet

Odpowiedz

19

można odgałęzienie na standardowy strumień wejściowy tak:

require 'stringio' 

def capture_name 
    $stdin.gets.chomp 
end 

describe 'capture_name' do 
    before do 
    $stdin = StringIO.new("James T. Kirk\n") 
    end 

    after do 
    $stdin = STDIN 
    end 

    it "should be 'James T. Kirk'" do 
    expect(capture_name).to be == 'James T. Kirk' 
    end 
end 
+0

Dzięki! Bardzo pomocne. – amorphid

Powiązane problemy