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

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

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

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

Q&A

解決済

1回答

851閲覧

テストで失敗した時に出力されるactual、expectedの読み取り方

mashoo

総合スコア8

Ruby

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

0グッド

0クリップ

投稿2020/01/03 07:16

カレンダーを出力するプログラムをRubyで書いています。
解いている問題
とりあえず動くコードは書けたので、テストを書いて、その後にリファクタリングする予定です。
(本当はテストコードを書いてから、本体のコードを書くのが望ましいのですが)
テストが失敗してしまう原因がわからなかったので、質問させていただきます。

カレンダー作成のコード、テストコード

require 'date' def main calender=calender(2021, 7) puts calender end def calender(year, month) first_date=Date.new(year, month, 1) end_date=Date.new(year, month, -1) days=[' Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] new_array=[] day_array=((first_date.day)..(end_date.day)).to_a day_array.each do |day| day_info=Date.new(year, month, day) new_day=day new_day="#{new_day.to_s.rjust(2)}" if new_day.to_s.length==1 new_day="#{" "+" "*3*first_date.wday+new_day.to_s}" if day==1 and day_info.wday!=0 new_day="#{" "+new_day}" if day==1 and day_info.wday==0 new_day = "#{new_day}\n" if day_info.wday==6 new_array << new_day end "#{first_date.strftime(" %B %Y")}\n#{days.join(' ')}\n#{new_array.join(' ')}" end if __FILE__ == $0 main end

引数で受け取った月の初日~末日の範囲オブジェクトを作成し、配列に代入しています。
それぞれの要素が条件に合致した場合、その要素を変化させて新しい配列に代入しています。

  • 受け取った日付が1~9の場合、 空白文字を左に一文字追加する
  • 日付が1かつ、その日付が日曜日ではなかった場合、曜日に合わせて空白文字を追加する。
  • 日付が1かつ、その日付が日曜だった場合、左に一文字空白文字を追加する
  • 日付が土曜日だった場合、改行する
#実行結果 July 2021 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

テストコード

ruby

1require 'minitest/autorun' 2require_relative '../lib/calender' 3 4 5class CalenderTest < Minitest::Test 6 def test_calender 7 @calender_2020_12=<<-TEXT 8 December 2020 9 Su Mo Tu We Th Fr Sa 10 1 2 3 4 5 11 6 7 8 9 10 11 12 12 13 14 15 16 17 18 19 13 20 21 22 23 24 25 26 14 27 28 29 30 31 15 TEXT 16 @calender_2019_12=<<-TEXT 17 December 2019 18 Su Mo Tu We Th Fr Sa 19 1 2 3 4 5 6 7 20 8 9 10 11 12 13 14 21 15 16 17 18 19 20 21 22 22 23 24 25 26 27 28 23 29 30 31 24 TEXT 25 @calender_2020_2=<<-TEXT 26 February 2020 27 Su Mo Tu We Th Fr Sa 28 1 29 2 3 4 5 6 7 8 30 9 10 11 12 13 14 15 31 16 17 18 19 20 21 22 32 23 24 25 26 27 28 29 33TEXT 34 assert_equal @calender_2020_12, calender(2020, 12) 35 assert_equal @calender_2019_12, calender(2019, 12) 36 assert_equal @calender_2020_2, calender(2020, 2) 37 end 38end

該当のソースコード

#テストコード実行結果 Failure: CalenderTest#test_calender [test/calender_test.rb:38]: --- expected +++ actual @@ -4,5 +4,4 @@ 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 27 28 29 30 31 -" + 27 28 29 30 31" rails test test/calender_test.rb:6

わからないこと

  • テストコードの実行結果のexpected(ーーー),actual(+++)で違いが出るはずだが、どこに違いがあるのかが読み取れない。

  • テストコードにある@calender_2020_2のように、カレンダーの最後の行が土曜日(Sa)まで埋まっている場合は、テストが通ってしまう。

最後に

本体のコードを読んでいただいた方は、読みにくいと感じたと思います。
自分もまだ、他の方の回答のコードを読んでおりません。
この後リファクタリングしていくつもりです。そのためにテストコードを完成させたいと考えています。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby

1 @calender_2020_12=<<-TEXT 2 December 2020 3 Su Mo Tu We Th Fr Sa 4 1 2 3 4 5 5 6 7 8 9 10 11 12 6 13 14 15 16 17 18 19 7 20 21 22 23 24 25 26 8 27 28 29 30 31 9 TEXT 10 p @calender_2020_12

とりあえず、pメソッドで表示してみると分かりますが
ヒアドキュメントは文法上の制約により、末尾に必ず改行が入ります。

そのため

diff

1- 27 28 29 30 31 2-" 3+ 27 28 29 30 31"

このような表示になっています。

改行で終わらない場合はchompメソッド等を用いるとよいでしょう。

ruby

1 @calender_2020_12=<<-TEXT.chomp 2 December 2020 3 Su Mo Tu We Th Fr Sa 4 1 2 3 4 5 5 6 7 8 9 10 11 12 6 13 14 15 16 17 18 19 7 20 21 22 23 24 25 26 8 27 28 29 30 31 9 TEXT

投稿2020/01/03 07:36

asm

総合スコア15147

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

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

mashoo

2020/01/03 09:00

回答ありがとうございます。 最後の行がStで終わっているテストデータがパスできる理由がわかりました。 ベストアンサーにさせて頂きます。
mashoo

2020/01/03 09:01

回答ありがとうございます。 最後の行がStで終わっているテストデータがパスする理由もわかりました。 ベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問