5

Ruby で StringIO の助けを借りて、ファイルの読み取りをモックしようとして います。以下は私のテストで、その隣はメインクラスの私のメソッドです。

def test_get_symbols_from_StringIO_file
    s = StringIO.new("YHOO,141414")
    assert_equal(["YHOO,141414"], s.readlines)
end

def get_symbols_from_file (file_name)
  IO.readlines(file_name, ',')
end

これがファイルの読み取りをモックする方法であるかどうかを知りたいです。また、コンテンツと同等のアサートを行うのではなく、クラス内のメソッドをモックする他の方法があるかどうかも知りたいです。

4

1 に答える 1

10

メソッドget_symbols_from_fileがテストで呼び出されることはありません。動作することをテストしているだけです。StringIO#readlinesつまり、次のようになります。

StringIO.new("YHOO,141414").readlines == ["YHOO,141414"] #=> true

ファイルのプレースホルダーとしてインスタンスを使用する場合は、ファイル名ではなくインスタンスStringIOを取るようにメソッドを変更する必要があります。File

def get_symbols_from_file(file)
  file.readlines(',')
end

Fileとインスタンスの両方が にStringIO応答するreadlinesため、上記の実装は両方を処理できます。

def test_get_symbols_from_file
  s = StringIO.new("YHOO,141414")
  assert_equal(["YHOO,141414"], get_symbols_from_file(s))
end

ただし、このテストは失敗します。readlines行セパレーターが含まれているため、2 つの要素"YHOO,"(コンマに注意) と"141414". 要素が 1 つの配列が必要"YHOO,141414"です。

多分あなたはこのようなものを探しています:

def test_get_symbols_from_file
  s = StringIO.new("YHOO,141414")
  assert_equal(["YHOO", "141414"], get_symbols_from_file(s))
end

def get_symbols_from_file(file)
  file.read.split(',')
end

本当に使用したい場合はIO::readlines、次を作成できますTempfile

require 'tempfile'

def test_get_symbols_from_file
  Tempfile.open("foo") { |f|
    f.write "YHOO,141414"
    f.close
    assert_equal(["YHOO", "141414"], get_symbols_from_file(f.path))
  }
end
于 2013-10-01T08:01:55.740 に答える