1

テストで発生した失敗とエラーをログ ファイルに書き込んで、画面に表示されないようにしようとしていますが、エラーとアサートの失敗が STDERR ではなく STDOUT に書き込まれるように見えます。何時間もグーグルで調べた後、この出力をリダイレクトする方法に関する情報を見つけることができませんでした。助けていただければ幸いです。

4

3 に答える 3

1

後でログファイルに書き込むために、出力を StringIO にリダイレクトしようとしましたか?

original_stdout = $stdout
original_stderr = $stderr
fake_stdout = StringIO.new
fake_stderr = StringIO.new

$stdout = fake_stdout
$stderr = fake_stderr

次に、テストを実行した後:

$stdout = original_stdout
$stderr = original_stderr

@stdout = fake_stdout.string
@stderr = fake_stderr.string

これがうまくいくかどうかはわかりませんが...

于 2011-08-17T20:46:58.653 に答える
1

Why should the errors not be on stdout? Up to now I have no prepared solution to suppress the output for specific errors.

If you accept the unchanged output, I have a solution to store errors and failures in a file. It will be no problem to create a 2nd file for Notifications...

gem 'test-unit'
require 'test/unit'

module Test
  module Unit
    class TestSuite
      alias :old_run :run
      def run(result, &progress_block)
        old_run(result, &progress_block)
        File.open('test.log', 'w'){|f|
          result.faults.each{|err|
            case err
              when Test::Unit::Error, Test::Unit::Failure
                f << err.long_display
                f << "\n===========\n"
              #not in log file
              when Test::Unit::Pending, Test::Unit::Notification, Test::Unit::Omission
              end
          }
        }
      end
    end
  end
end


class MyTest < Test::Unit::TestCase

  def test_1()
    assert_equal( 3, 1+1) #failure
  end
  def test_2()
    1 / 0 #force an error
  end
  def test_3()
    notify 'sss'
  end
  def test_4()
    pend "MeineKlasse.new"
  end
  def test_5
    omit 'aaa' if RUBY_VERSION == '1.9.2'
  end

  def test_5
    assert_in_delta( 0.1, 0.00001, 1.0/10)
  end

end
于 2011-08-17T22:32:35.553 に答える