質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Q&A

解決済

2回答

372閲覧

Rubyでテストを書きたい。

syuma1214

総合スコア36

Ruby

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

0グッド

0クリップ

投稿2018/10/01 00:57

編集2018/10/01 00:58

前提・実現したいこと

いま、Rubyでプログラムを書いています。
そこで、true_or_falseget_charのテストを書きたいと思っています。

Ruby

1def true_or_false(i, j) 2 $inputs.include?([i, j]) ? 'T ' : 'F ' 3end 4 5def get_char(i, j) 6 i == j ? '- ' : true_or_false(i, j) 7end 8 9$inputs = gets.to_i.times.map do 10 gets.split 11end 12 13$inputs.size.times do |i| 14 $inputs.size.times do |j| 15 print get_char i, j 16 end 17 puts 18end

発生している問題・エラーメッセージ

ruby main_test.rbを実行すると、main.rbgetsを呼んでいるためユーザー入力待ちになってしまいます。
関数だけテストしたい場合はどうしたらいいのでしょうか?

該当のソースコード

Ruby

1require 'minitest/autorun' 2require './main.rb' 3 4class MainTest < Minitest::Test 5 $inputs = [ 6 [1, 3], 7 [2, 1], 8 [2, 3] 9 ] 10 11 def test_get_char 12 assert_equal '- ', get_char(1, 1) 13 end 14 15 def test_win_or_loss 16 assert_equal 'W ', true_or_false(1, 3) 17 end 18end

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

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

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

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

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

guest

回答2

0

楽なのはテスト対象側(main.rb)を

lang

1if $0 == __FILE__ 2 $inputs = gets.to_i.times.map do 3 gets.split 4 end 5 6 $inputs.size.times do |i| 7 $inputs.size.times do |j| 8 print get_char i, j 9 end 10 puts 11 end 12end

と改変する事です

これで、requireによる呼び出しではif内は実行されません


対象側に手を加えるのが嫌な場合は

lang

1require 'minitest/autorun' 2 3$stdin = StringIO.new <<TEST_STR 43 51 3 62 1 72 3 8TEST_STR 9require './main.rb' 10 11class MainTest < Minitest::Test 12 $inputs = [ 13 [1, 3], 14 [2, 1], 15 [2, 3] 16 ] 17 def test_get_char 18 assert_equal '- ', get_char(1, 1) 19 end 20 21 def test_win_or_loss 22 assert_equal 'W ', true_or_false(1, 3) 23 end 24end

という方法もあります。

なお、$stdoutも同様にStringIO.newを代入する事で
$stdout.stringで標準出力に書き込まれた文字列を取れるので
やろうと思えばassert_equalassert_matchでテストする事も可能でしょう

投稿2018/10/01 01:50

asm

総合スコア15147

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

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

syuma1214

2018/10/01 01:53

丁寧な回答ありがとうございます! ちょうど、$stdinを調べていたところでした。 記載していませんが、対象側に手を加えたくないというところも汲み取って頂きありがとうございます!
guest

0

ベストアンサー

関数の記述と入力待ちの部分にファイルを分けましょう。
require_relative を使って関数定義のファイルを読み込めば同じように実行できるはずです。

投稿2018/10/01 01:38

mather

総合スコア6753

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

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

syuma1214

2018/10/01 01:42

回答ありがとうございます。 ファイルを別けるやり方しかありませんか? できればファイルは別けたくないと思ってます。
mather

2018/10/01 01:48

if __FILE__ == $0 # スクリプトを直接実行したときだけ動かしたい処理 end としてみてください。
syuma1214

2018/10/01 01:50

ありがとうございます! 大変助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問