2013-06-23 6 views
6

Herausforderung

Hallo! Wie könnte ich für die folgende Ruby-Methode Benutzereingaben mit einem RSpec-Test simulieren, ohne die Methode neu zu schreiben?Wie schreibe ich einen RSpec-Test für eine Ruby-Methode, die "gets.chomp" enthält?

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

Ich habe a similar question gefunden, aber dieser Ansatz mit einer Klasse erfordert zu schaffen. Unterstützt RSpec Stubbing für Methoden, die keiner Klasse angehören?

eine andere Werke, aber ich bin gezwungen, das Verfahren neu zu schreiben

ich die Methode neu schreiben kann, so dass es eine Variable mit dem Standardwert „gets.chomp“ so hat:

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

Jetzt kann ich einen RSpec Test wie folgt schreiben:

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

Antwort

19

Sie können Standardeingabe-Stream wie folgt ausdrücken:

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

Danke! Sehr hilfreich. – amorphid

Verwandte Themen