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

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

ただいまの
回答率

87.59%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 660

score 8

カレンダーを出力するプログラムを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

テストコード

require 'minitest/autorun'
require_relative '../lib/calender'


class CalenderTest < Minitest::Test
  def test_calender
    @calender_2020_12=<<-TEXT
      December 2020
 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
 TEXT
    @calender_2019_12=<<-TEXT
      December 2019
 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
 TEXT
    @calender_2020_2=<<-TEXT
      February 2020
 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
TEXT
    assert_equal @calender_2020_12, calender(2020, 12)
    assert_equal @calender_2019_12, calender(2019, 12)
    assert_equal @calender_2020_2, calender(2020, 2)
  end
end

該当のソースコード

#テストコード実行結果
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)まで埋まっている場合は、テストが通ってしまう。

最後に

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

    @calender_2020_12=<<-TEXT
      December 2020
 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
 TEXT
    p @calender_2020_12

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

そのため

- 27 28 29 30 31
-"
+ 27 28 29 30 31"

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

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

    @calender_2020_12=<<-TEXT.chomp
      December 2020
 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
 TEXT

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/03 18:00

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

    キャンセル

  • 2020/01/03 18:01

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

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る