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

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

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

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

Q&A

解決済

2回答

2960閲覧

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

ayu

総合スコア212

RSpec

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

0グッド

0クリップ

投稿2015/12/06 09:58

こんばんわ。

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になっているのかが理解できません。
お手数をおかけしますが、ご教授をよろしくおねがいします。

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

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

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

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

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

guest

回答2

0

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

解説:

ruby

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

この 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 10:51

katoy

総合スコア22324

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

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

ayu

2015/12/06 13:16

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

0

ベストアンサー

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

ruby

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

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

ruby

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

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

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

Link

投稿2015/12/06 10:35

gouf

総合スコア2321

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

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

ayu

2015/12/06 13:16

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問