🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Q&A

1回答

1582閲覧

【Ruby】標準入力をテストコード内で指定したい

mozamoza_fruit

総合スコア11

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

0グッド

0クリップ

投稿2020/12/22 11:28

#概要
標準入出力を確認するテストコードを書きたい。
ある標準入力に対して標準出力を出すというプログラムを書きました。

terminal上で手入力で入れたものが正しく出力されることは確認できたのですが、
それをテストコードで表現する方法がわからなくて困っています。
#解決したいこと
テストコード内で標準入力を指定したい。
テストはminitestを使っていますが、Rspecでも書けます。
#ソースコード

ruby

1#目標コイン数までの最短経路を考える。 2puts "半角スペースで区切り数字を入力してください。" 3 4#入力値 5input = gets.chomp.split(' ') 6A = input[0].to_i 7B = input[1].to_i 8C = input[2].to_i 9#ログイン回数 10i = 1 11#所持コイン枚数 12possession_coin = (i%7 == 0) ? A*i+B : A*i 13 14until possession_coin >= C 15 i += 1 16 possession_coin = (i%7 == 0)? A*i+B : A*i 17end 18 p i

#自分なりの予測
$stdin を使うと標準入力を指定できそう?なのですが、調べても望んだ形の使い方が分からずにいます。。

terminalで実行コマンドを押す時に

$ (当該プログラムファイル).rb < test_text.rb

という形で別のテキストファイルにあるテキストを入力値とすることはできました。

よろしくお願いしますm(_ _)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

$stdinStringIOで書き換えるとよいと思います。


ruby

1require "minitest/autorun" 2require "stringio" 3 4describe "Test" do 5 describe "4 5 7" do 6 $stdin = StringIO.new("4 5 7\n") 7 stdout = $stdout 8 $stdout = StringIO.new 9 load "./target.rb" 10 output = $stdout.string 11 $stdout = stdout 12 it "must Number" do 13 _(output.lines[-1]).must_match /^\d+\n?$/ 14 end 15 it "must 2" do 16 _(output.lines[-1].to_i).must_equal 2 17 end 18 end 19end

投稿2020/12/22 23:54

編集2020/12/23 00:32
asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mozamoza_fruit

2020/12/25 09:29

コメントありがとうございます! 以下の用に書いたのですが、やはり標準入力を求められてしまいます。 require_relative '../../lib/Q4get_coin' require 'stringio' RSpec.describe 'GetCoin' do $stdin = StringIO.new("3 0 10") $stdout = StringIO.new   it "get coin?" do   out = $stdout.string  expect(out).to eq "4"  end end 上記記述を以下のように理解しています。 ・$stdinは標準入力を表すオブジェクトで、デフォルトではユーザーに求めるようになっている。 https://docs.ruby-lang.org/ja/latest/method/Kernel/v/stdin.html ・$stdinを初期化し、引数(指定したい入力値)を持たせる。 ・$stdoutも同様。$stdout.stringで出力結果を取得。 そして標準入力に渡されない原因はどこにあるのでしょうか? かなり投げやりな質問で申し訳ないですが色々調べて試したつもりですが解決に至りませんでした。。 助言お願いします。
asm

2020/12/25 13:15

> require_relative '../../lib/Q4get_coin' この時点でスクリプトを実行してしまうからです。 it "get coin?" do load "../../lib/Q4get_coin" out = $stdout.string expect(out).to eq "4" end みたいな感じで
asm

2020/12/25 13:16

ただし、 テストしやすい形に切り分けて関数化するのがベストな方法ではあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問