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

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

ただいまの
回答率

90.51%

  • RSpec

    236questions

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

RSpecの実行結果とコマンドの結果が合わない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,195

ayu

score 196

こんばんわ。

rspecの実行結果と実際の結果が合わないので、質問をします。

下記がクラスの定義になります。

class Car
  attr_accessor :name, :color
  attr_reader :x, :fuel

  @@count = 0

  def self.count
    @@count
  end

  def initialize(name, color)
    @name = name
    @color = color
    @x = 0
    @fuel = 100
    @@count += 1
  end

  def info
    puts "名前:#{self.name}, 色:#{self.color}"
    # puts "現在の位置: #{self.x}km"
    # puts "ガソリン量: #{self.fuel}リットル"
  end

  def run(distance)
    if distance > @fuel
      puts "ガソリンが足りません"
      return
    end
    @x += distance
    set_fuel(@fuel - distance)
  end

  def charge(litre)
    set_fuel(@fuel + litre)
  end

  private

  def set_fuel(litre)
     @fuel = litre
  end
end

rspecの記述は下記の通りです。

describe Car do
  describe '#info' do
    it 'info is valid' do
      my_car = Car.new('ゴンフォート', '赤')
      expect(my_car.info).to eq '名前:ゴンフォート, 色:赤'
    end
  end
end

エラーメッセージです。

Car
  #info
名前:ゴンフォート, 色:赤
    info is valid (FAILED - 1)

Failures:

  1) Car#info info is valid
     Failure/Error: expect(@my_car.info).to eq '名前:ゴンフォート, 色:赤'

       expected: "名前:ゴンフォート, 色:赤"
            got: nil

       (compared using ==)
     # ./car_spec.rb:7:in `block (3 levels) in <top (required)>'

Finished in 0.01744 seconds (files took 0.14312 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./car_spec.rb:5 # Car#info info is valid

普通に次の通り行っても、メソッドは実行されます。

my_car = Car.new('ゴンフォート', '赤')
car.info

=>名前:ゴンフォート, 色:赤

なぜ、結果がnilになっているのかが理解できません。 お手数をおかけしますが、ご教授をよろしくおねがいします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

puts を呼び出すと、自身の仕事を終えたのち、nil を返します

p (puts 'Hello') # => "Hello"
# => nil

テストが通る書き方に変えるとすれば、info メソッドはputs せず、呼び出し元がputs するように書き換える必要があるかもしれません

def info
  # puts "名前:#{@name}, 色:#{@color}"
  "名前:#{@name}, 色:#{@color}"
end

このメソッドに複数の値を処理させたい場合は、配列やハッシュに含めて返すなど、工夫が必要かもしれませんね

何か参考になれば幸いです

 Link

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/06 22:16

    なるほど。
    putsは呼び出した後に、仕事が終わったらnilを返すからなんですね。
    これは知らなかった・・・
    また、参考リンクもありがとうございます。
    一読しておきます!

    キャンセル

0

原因:  質問文にある info メソッドは常に nil を返すからです。

解説:

def info
    puts "名前:#{self.name}, 色:#{self.color}"
end

この info メソッドは nil を返します。
(puts ... は nil を返します。そして それは info の return 値になります)

rspec の
   expect(my_car.info).to eq '...'
は my_car.info の return 値が eq の後の文字列と一致するかをテストしています。

このテストをパスさせるには、次のようにするのが一番簡単な方法と思います。

def info
    "名前:#{self.name}, 色:#{self.color}"
end

この変更をすると info メソッドはコンソールに文字列を出力しくなります。
info の値をコンソールに表示する場合は
    p my_car.info
とか
    puts my_car.info
とするようにします。

info を文字列が返るようにしておくと、コンソール出力, ファイル出力したり、web アプリで ブラウザ画面の表示するときにも info を使えるようになります。
(info 中で puts してしまっていると、ファイル出力するときは、info とは別のメソッドをつくる必要が発生してしまう)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/06 22:16

    >(puts ... は nil を返します。そして それは info の return 値になります)
    ここを全く知らなかったです。
    原因が分かってすっきりしました。
    ありがとうございます!

    キャンセル

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

  • RSpec

    236questions

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