事象
あるhashの書き出しをファイルに保存する処理のテストをしていて、StringIOを使ってテストしようとしたところ、
下記エラーメッセージがでました。
1) Hoge ファイルの作成 use StringIO Failure/Error: Hoge.test(def_path) #<File (class)> asked to yield |[#<StringIO:0x000055e05af5b758>]| but no block was passed
エラーメッセージから察するにブロック(file)が渡されていない様にみえますが、
RSpecでFileIOをスタブにする
↑ここのお手本を参考にできているつもりでありました。
YAMLの出力テストする場合、どこを改良したら良いかご教示お願いします。
テスト結果
Hoge ファイルの作成 use StringIO (FAILED - 1) Failures: 1) Hoge ファイルの作成 use StringIO Failure/Error: Hoge.test(def_path) #<File (class)> asked to yield |[#<StringIO:0x0000559cfcbfe660>]| but no block was passed # ./lib_sc.rb:7:in `test' # ./spec/lib_sc_spec.rb:13:in `block (3 levels) in <top (required)>' Finished in 0.01155 seconds (files took 0.30146 seconds to load) 1 example, 1 failure Failed examples: rspec ./spec/lib_sc_spec.rb:10 # Hoge ファイルの作成 use StringIO
ソース
lib_sc.rb
ruby
1require 'yaml' 2require 'json' 3 4class Hoge 5 def self.test(conf_path) 6 data = { "fruits" => ["Orange", "Apple", "Grape"] } 7 YAML.dump( data, File.open(conf_path, 'w') ) 8 end 9end
spec/lib_sc_spec.rb
ruby
1require 'stringio' 2require 'tempfile' 3require 'fileutils' 4require_relative '../lib_sc.rb' 5 6RSpec.describe Hoge do 7 let(:def_path){ File.join(__dir__, 'Assets/def_file.yml') } 8 9 describe 'ファイルの作成' do 10 it 'use StringIO' do 11 file = StringIO.new('','w') 12 allow(File).to receive(:open).and_yield(file) 13 Hoge.test(def_path) 14 end 15 end 16end
環境
$ uname -a Linux ansible-web 4.15.0-54-generic #58-Ubuntu SMP Mon Jun 24 10:55:24 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux $ ruby -v ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux] $ rspec -v RSpec 3.9 - rspec-core 3.9.2 - rspec-expectations 3.9.2 - rspec-mocks 3.9.1 - rspec-support 3.9.3
以上、よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/14 13:14