2013-06-23 32 views
6

Thách thức

Xin chào! Đối với phương thức Ruby sau đây, làm thế nào tôi có thể mô phỏng đầu vào của người dùng bằng cách sử dụng một kiểm tra RSpec mà không cần viết lại phương thức này?Làm cách nào để viết một bài kiểm tra RSpec cho một phương thức Ruby có chứa "gets.chomp"?

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

Tôi đã tìm thấy a similar question, nhưng phương pháp này yêu cầu tạo bằng cách sử dụng lớp học. RSpec có hỗ trợ stubbing cho các phương thức không có trong lớp không?

Một tác phẩm khác nhau, nhưng tôi buộc phải viết lại phương pháp

tôi có thể viết lại phương pháp này vì vậy nó có một biến với giá trị mặc định của "gets.chomp" như thế này:

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

Bây giờ tôi có thể viết một bài kiểm tra RSpec như thế này:

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

Trả lời

19

Bạn có thể còn sơ khai ra dòng đầu vào tiêu chuẩn như thế này:

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

Cảm ơn! Rất hữu ích. – amorphid

Các vấn đề liên quan