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

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

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

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

Q&A

解決済

2回答

895閲覧

Ruby テストコードを作成し、test/unitを使いたい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

0グッド

0クリップ

投稿2021/04/02 08:12

編集2021/04/02 08:29

Ruby テストコードを作成し、test/unitでテストしたい

test/unitを用いてテストしようとしましたが、テストコードの書き方でつまづいてしまいました。

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

ruby test_judge.rb g あなたはグー、私はパー、負けです。 Loaded suite test_judge Started E ========================================================================== 8: end 9: 10: def test_judge => 11: judge1 = Judge.new("g") 12: 13: judge1.judge 14: assert_true = (judge1 == 0) test_judge.rb:11:in `test_judge' test_judge.rb:11:in `new' test_judge.rb:11:in `initialize' Error: test_judge(JudgeTest): ArgumentError: wrong number of arguments (given 1, expected 0) ========================================================================== Finished in 0.002602 seconds. -------------------------------------------------------------------------- 1 tests, 0 assertions, 0 failures, 1 errors, 0 pendings, 0 omissions, 0 notifications 0% passed -------------------------------------------------------------------------- 384.32 tests/s, 0.00 assertions/s

テストコードを書きたいのですが、詰まってしまいました。

該当のソースコード

Ruby

1class Judge 2 def self.judge(player, computer) 3 if player == computer then 4 return 2 5 elsif (player == "g" && computer == "c") || 6 (player == "c" && computer == "p") || 7 (player == "p" && computer == "g") 8 return 0 9 else 10 return 1 11 end 12 end 13end 14 15 16player = gets.chomp 17hands = {"g" => "グー", "c" => "チョキ", "p" => "パー"} 18computer = hands.keys.sample 19result = {0 => "勝ち", 1 => "負け", 2 => "引き分け"} 20 21puts "あなたは#{hands[player]}、私は#{hands[computer]}#{result[Judge.judge(player,computer)]}です。"
require 'test/unit' class JudgeTest < Test::Unit::TestCase require "./judge" def cleanup p :cleanup end def test_judge judge1 = Judge.new("g") judge1.judge assert_true = (judge1 == 0) end end

試したこと

Test::Unitでテストを書く
を参考にしましたが、できませんでした。

補足情報(FW/ツールのバージョンなど)

ruby 2.7.2

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

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

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

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

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

guest

回答2

0

全ての場合でテストコードを書き、正しく動きました。

ありがとうございました。

ruby

1#playerがグー、computerがチョキの時に勝ちになることのテスト 2 3require 'test/unit' 4 5class JudgeTest < Test::Unit::TestCase 6 require "./judge" 7 8 def cleanup 9 p :cleanup 10 end 11 12 #playerがグー、computerがチョキ、勝ち 13 def test_judge1 14 player = "g" 15 computer = "c" 16 judge_result = Judge.judge(player, computer) 17 assert_equal(0, judge_result) 18 end 19 20 #playerがグー、computerがパー、負け 21 def test_judge2 22 player = "g" 23 computer = "p" 24 judge_result = Judge.judge(player, computer) 25 assert_equal(1, judge_result) 26 end 27 28 #playerがグー、computerがグー、引き分け 29 def test_judge3 30 player = "g" 31 computer = "g" 32 judge_result = Judge.judge(player, computer) 33 assert_equal(2, judge_result) 34 end 35 36 #playerがチョキ、computerがグー、負け 37 def test_judge4 38 player = "c" 39 computer = "g" 40 judge_result = Judge.judge(player, computer) 41 assert_equal(1, judge_result) 42 end 43 44 #playerがチョキ、computerがチョキ、引き分け 45 def test_judge5 46 player = "c" 47 computer = "c" 48 judge_result = Judge.judge(player, computer) 49 assert_equal(2, judge_result) 50 end 51 52 #playerがチョキ、computerがパー、勝ち 53 def test_judge6 54 player = "c" 55 computer = "p" 56 judge_result = Judge.judge(player, computer) 57 assert_equal(0, judge_result) 58 end 59 60 #playerがパー、computerがグー、勝ち 61 def test_judge7 62 player = "p" 63 computer = "g" 64 judge_result = Judge.judge(player, computer) 65 assert_equal(0, judge_result) 66 end 67 68 69 #playerがパー、computerがチョキ、負け 70 def test_judge8 71 player = "p" 72 computer = "c" 73 judge_result = Judge.judge(player, computer) 74 assert_equal(1, judge_result) 75 end 76 77 78 #playerがパー、computerがパー、引き分け 79 def test_judge9 80 player = "p" 81 computer = "p" 82 judge_result = Judge.judge(player, computer) 83 assert_equal(2, judge_result) 84 end 85 86end
ruby test_judge.rb Loaded suite test_judge Started :cleanup .:cleanup .:cleanup .:cleanup .:cleanup .:cleanup .:cleanup .:cleanup .:cleanup . Finished in 0.000331 seconds. ----------------------------------------------------------------------------------- 9 tests, 9 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications 100% passed ----------------------------------------------------------------------------------- 27190.33 tests/s, 27190.33 assertions/s

投稿2021/04/04 03:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

詳しく説明すると長くなりそうなので「自分だったらこうするんじゃないかな」という修正例を貼ってみます。

まずは judge.rb
player = gets.chomp 以下の部分を
if $0 == __FILE__ ... end で囲みます。
(こうすると test_judge.rb を実行したときにはこの部分が実行されなくなりますが、一般的にはこうすることが多いと思います)

if $0 == __FILE__ player = gets.chomp hands = {"g" => "グー", "c" => "チョキ", "p" => "パー"} computer = hands.keys.sample result = {0 => "勝ち", 1 => "負け", 2 => "引き分け"} puts "あなたは#{hands[player]}、私は#{hands[computer]}、#{result[Judge.judge(player,computer)]}です。" end

次に、テストの方の test_judge メソッドを次のように修正します。

# プレイヤーがパー、コンピュータがグーの場合ユーザの勝ちとなること def test_judge player = "p" computer = "g" judge_result = Judge.judge(player, computer) assert_equal(0, judge_result) end

masuda_58 さんが意図したものとは違っているかもしれませんが、参考になれば嬉しいです。

投稿2021/04/02 13:22

編集2021/04/02 13:23
sonota88

総合スコア43

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

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

退会済みユーザー

退会済みユーザー

2021/04/04 02:56

if $0 == __FILE__ ... end で囲みます。 これは、じゃんけんの勝敗機能であるJudge クラスをテストしたい為に、test_judge.rbで動作(テスト?)しないようにするための処理ということで、理解は正しいでしょうか? 初学者故に、質問も曖昧で申し訳ございません。
sonota88

2021/04/04 07:22 編集

だいたい合ってると思います。 「test_judge.rb から require したときは動作しないようにするため」というとより正確だと思います。 囲んだ部分がテストを実行したときに動いてしまうと、 player = gets.chomp の部分でユーザからの入力待ちになって止まってしまいます。 それでは困る(テストは最後まで自動で動いてほしい)だろうと考えて回答に貼ったコードのようにしてみました。 if $0 == __FILE__ 〜 についてはたとえば下記を参考にしてください。 __FILE__ は実行中のプログラムのファイル名 - gan2 の Ruby 勉強日記 https://gan2-2.hatenadiary.org/entry/20070520/1179649635 $0, __FILE__ 個別の公式の説明は下記にあります。 $0 (Ruby 3.0.0 リファレンスマニュアル) https://docs.ruby-lang.org/ja/latest/method/Kernel/v/0.html __FILE__ https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#pseudo
退会済みユーザー

退会済みユーザー

2021/04/05 08:50

ありがとうございました! 勉強させていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問