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

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

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

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

RSpec

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

Q&A

解決済

1回答

203閲覧

入力データを希望の出力のように、表示するプログラムをRSpecで検証してテストをパスさせたい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

RSpec

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

0グッド

0クリップ

投稿2017/08/05 09:46

編集2017/08/05 09:49

###前提・実現したいこと
入力したデータを実現したい出力のように、表示するプログラムをRubyで書いて、それをRSpecのspecファイルを作成してテストをパスしたい。

よろしくお願いいたします。

以下が入力データ

3 5 11 7 8 19 1 10000 0

以下が実現したい出力です。

Case 1: 3 Case 2: 5 Case 3: 11 Case 4: 7 Case 5: 8 Case 6: 19 Case 7: 1 Case 8: 10000 0

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

$ bundle exec rspec spec/itp1_3b_spec.rb PrintTest #datainput 正常系: x = 3 should be a kind of Integer 正常系: x = 5 should be a kind of Integer 正常系: x = 11 should be a kind of Integer 正常系: x = 7 should be a kind of Integer 正常系: x = 8 should be a kind of Integer 正常系: x = 19 should be a kind of Integer 正常系: x = 1 should be a kind of Integer 正常系: x = 10000 should be a kind of Integer 正常系: x = 0 should be a kind of Integer #dataset 正常値: 入力が 3 のときの結果の出力テスト should output "Case 1: 3\n" to stdout 正常値: 入力が 5 のときの結果の出力テスト should output "Case 2: 5\n" to stdout (FAILED - 1) 正常値: 入力が 11 のときの結果の出力テスト should output "Case 3: 11\n" to stdout (FAILED - 2) 正常値: 入力が 7 のときの結果の出力テスト should output "Case 4: 7\n" to stdout (FAILED - 3) 正常値: 入力が 8 のときの結果の出力テスト should output "Case 5: 8\n" to stdout (FAILED - 4) 正常値: 入力が 19 のときの結果の出力テスト should output "Case 6: 19\n" to stdout (FAILED - 5) 正常値: 入力が 1 のときの結果の出力テスト should output "Case 7: 1\n" to stdout (FAILED - 6) 正常値: 入力が 10000 のときの結果の出力テスト should output "Case 8: 10000\n" to stdout (FAILED - 7) 正常値: 入力が 0 のときの結果の出力テスト should output "" to stdout Failures: 1) PrintTest#dataset 正常値: 入力が 5 のときの結果の出力テスト should output "Case 2: 5\n" to stdout Failure/Error: expect { obj.dataset }.to output(data2).to_stdout expected block to output "Case 2: 5\n" to stdout, but output "Case 1: 5\n" Diff: @@ -1,2 +1,2 @@ -Case 2: 5 +Case 1: 5 # ./spec/itp1_3b_spec.rb:39:in `block (5 levels) in <top (required)>' 2) PrintTest#dataset 正常値: 入力が 11 のときの結果の出力テスト should output "Case 3: 11\n" to stdout Failure/Error: expect { obj.dataset }.to output(data2).to_stdout expected block to output "Case 3: 11\n" to stdout, but output "Case 1: 11\n" Diff: @@ -1,2 +1,2 @@ -Case 3: 11 +Case 1: 11 # ./spec/itp1_3b_spec.rb:39:in `block (5 levels) in <top (required)>' 3) PrintTest#dataset 正常値: 入力が 7 のときの結果の出力テスト should output "Case 4: 7\n" to stdout Failure/Error: expect { obj.dataset }.to output(data2).to_stdout expected block to output "Case 4: 7\n" to stdout, but output "Case 1: 7\n" Diff: @@ -1,2 +1,2 @@ -Case 4: 7 +Case 1: 7 # ./spec/itp1_3b_spec.rb:39:in `block (5 levels) in <top (required)>' 4) PrintTest#dataset 正常値: 入力が 8 のときの結果の出力テスト should output "Case 5: 8\n" to stdout Failure/Error: expect { obj.dataset }.to output(data2).to_stdout expected block to output "Case 5: 8\n" to stdout, but output "Case 1: 8\n" Diff: @@ -1,2 +1,2 @@ -Case 5: 8 +Case 1: 8 # ./spec/itp1_3b_spec.rb:39:in `block (5 levels) in <top (required)>' 5) PrintTest#dataset 正常値: 入力が 19 のときの結果の出力テスト should output "Case 6: 19\n" to stdout Failure/Error: expect { obj.dataset }.to output(data2).to_stdout expected block to output "Case 6: 19\n" to stdout, but output "Case 1: 19\n" Diff: @@ -1,2 +1,2 @@ -Case 6: 19 +Case 1: 19 # ./spec/itp1_3b_spec.rb:39:in `block (5 levels) in <top (required)>' 6) PrintTest#dataset 正常値: 入力が 1 のときの結果の出力テスト should output "Case 7: 1\n" to stdout Failure/Error: expect { obj.dataset }.to output(data2).to_stdout expected block to output "Case 7: 1\n" to stdout, but output "Case 1: 1\n" Diff: @@ -1,2 +1,2 @@ -Case 7: 1 +Case 1: 1 # ./spec/itp1_3b_spec.rb:39:in `block (5 levels) in <top (required)>' 7) PrintTest#dataset 正常値: 入力が 10000 のときの結果の出力テスト should output "Case 8: 10000\n" to stdout Failure/Error: expect { obj.dataset }.to output(data2).to_stdout expected block to output "Case 8: 10000\n" to stdout, but output "Case 1: 10000\n" Diff: @@ -1,2 +1,2 @@ -Case 8: 10000 +Case 1: 10000 # ./spec/itp1_3b_spec.rb:39:in `block (5 levels) in <top (required)>' Finished in 0.04846 seconds (files took 0.13541 seconds to load) 18 examples, 7 failures Failed examples: rspec ./spec/itp1_3b_spec.rb[1:2:2:1] # PrintTest#dataset 正常値: 入力が 5 のときの結果の出力テスト should output "Case 2: 5\n" to stdout rspec ./spec/itp1_3b_spec.rb[1:2:3:1] # PrintTest#dataset 正常値: 入力が 11 のときの結果の出力テスト should output "Case 3: 11\n" to stdout rspec ./spec/itp1_3b_spec.rb[1:2:4:1] # PrintTest#dataset 正常値: 入力が 7 のときの結果の出力テスト should output "Case 4: 7\n" to stdout rspec ./spec/itp1_3b_spec.rb[1:2:5:1] # PrintTest#dataset 正常値: 入力が 8 のときの結果の出力テスト should output "Case 5: 8\n" to stdout rspec ./spec/itp1_3b_spec.rb[1:2:6:1] # PrintTest#dataset 正常値: 入力が 19 のときの結果の出力テスト should output "Case 6: 19\n" to stdout rspec ./spec/itp1_3b_spec.rb[1:2:7:1] # PrintTest#dataset 正常値: 入力が 1 のときの結果の出力テスト should output "Case 7: 1\n" to stdout rspec ./spec/itp1_3b_spec.rb[1:2:8:1] # PrintTest#dataset 正常値: 入力が 10000 のときの結果の出力テスト should output "Case 8: 10000\n" to stdout

###該当のソースコード

ruby

1class PrintTest 2 attr_reader :x, :i 3 4 def initialize 5 @x, @i = 0, 0 6 end 7 8 def dataset 9 loop do 10 datainput 11 break if @x == 0 12 @i += 1 13 dataoutput 14 end 15 end 16 17 def datainput 18 xf = gets.to_f 19 @x = integer_or_float(xf) 20 end 21 22 def dataoutput 23 puts "Case %d: %d" % [@i, @x] 24 end 25 26 private 27 28 def integer_or_float(x) 29 ((x - x.to_i) == 0.0)? x.to_i : x.to_f 30 end 31end 32 33pp = PrintTest.new 34pp.dataset

ruby

1require './itp1_3b' 2 3describe PrintTest do 4 let(:obj) { PrintTest.new } 5 6 describe "#datainput" do 7 [3, 5, 11, 7, 8, 19, 1, 10000, 0].each do |data| 8 context "正常系: x = #{data}" do 9 before do 10 allow(obj).to receive(:gets).and_return(data) 11 obj.datainput 12 end 13 it { expect(obj.x).to be_a_kind_of(Integer) } 14 end 15 end 16 17 context "異常系" do 18 end 19 end 20 21 describe "#dataset" do 22 [ 23 [3, "Case 1: 3\n"], 24 [5, "Case 2: 5\n"], 25 [11, "Case 3: 11\n"], 26 [7, "Case 4: 7\n"], 27 [8, "Case 5: 8\n"], 28 [19, "Case 6: 19\n"], 29 [1, "Case 7: 1\n"], 30 [10000, "Case 8: 10000\n"], 31 [0, ""] 32 ].each do |data1, data2| 33 context "正常値: 入力が #{data1} のときの結果の出力テスト" do 34 before do 35 allow(obj).to receive(:gets).and_return(data1) 36 allow(obj).to receive(:loop).and_yield 37 end 38 it do 39 expect { obj.dataset }.to output(data2).to_stdout 40 end 41 end 42 end 43 end 44end

###試したこと
たぶん、and_yieldのところで、回数がカウントされていないのだと思われますが、よくわかりません。
もしかすると、yield_control.exactly()でしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

let(:obj) { PrintTest.new }してるため
全exampleでinitializeされて@i=0になってます。

同じインスタンスのPrintTestを使いまわさないと@iが加算されないので

ruby

1describe "#dataset" do 2 obj = PrintTest.new 3 [ 4 [3, "Case 1: 3\n"], 5 #以下略

allow(obj).to receive(:loop).and_yieldの部分は不要に思えます

投稿2017/08/05 15:12

hellomartha

総合スコア329

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

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

退会済みユーザー

退会済みユーザー

2017/08/05 15:53

ご回答ありがとうございます! なるほどです!見直してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問