[英]Rspec - Stubbing gets.chomp out of the constructor
我正在用Ruby和“游戲”類的構造函數中編寫Mastermind游戲,我想使用gets.chomp來詢問用戶名字。 相當容易,但是遇到麻煩的是在RSpec中測試該類時,但是我似乎無法正確地存入“ gets”和“ puts”,因為它們在構造函數中不是常規方法。
class Game
def initialize
puts "Please enter your name:"
@player = Player.new(gets.chomp)
end
end
describe Game do
Game.stub(:gets).and_return("Create Code AI")
Game.stub(:puts)
subject(:game) { Game.new }
describe "#new" do
its("player.name") { eql("Create Code AI") }
end
end
class Player
attr_reader :name
def initialize(name)
@name = name
end
end
我還嘗試過將存根放入“ before”和“ let”塊中,但似乎沒有任何效果。 任何幫助表示贊賞!
我有一種捕獲stdin和stdout的方法,可以在以下情況下進行測試:
require 'stringio'
module Kernel
def capture_stdout(console_input = '')
$stdin = StringIO.new(console_input)
out = StringIO.new
$stdout = out
yield
return out.string.strip
ensure
$stdout = STDOUT
$stdin = STDIN
end
end
現在,假設我要測試與stdin / stdout交互的方法:
def greet
name = gets
puts "Welcome, #{name}!"
end
我將編寫以下測試:
require 'rspec/autorun'
RSpec.describe '#say_name' do
it 'prints name correctly' do
input = 'Joe'
result = capture_stdout(input) do
greet
end
expect(result).to eql 'Welcome, Joe!'
end
end
我提供了上面的示例,以說明如何測試控制台輸入和輸出。
在您的情況下,測試可能如下所示:
describe Game do
subject(:game) do
capture_stdout('Create Code AI') { return Game.new }
end
describe "#new" do
its("player.name") { eql("Create Code AI") }
end
end
注意:為了#player
起作用, #player
應該是Game
的可訪問成員。 因此,您可能需要將此添加到您的Game
類中:
attr_reader :player
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.