Problem
You have some ruby code, a rake task for example, that outputs some results in the standard output, but you would like to test it in your unit tests.
MiniTest has capture_io and capture_subprocess_io, but there is nothing similar in UnitTest.
Solution
Looking at the code of the above MiniTest assertions you can create your own assertion to be used in your tests.
Create a new file under your test folder called MyAssertions and use the following code (taken from MiniTest), for your capture_output assertion:
module MyAssertions module CaptureOutput # Use as: # out = capture_output { method_to_call(param1, param2) } # output = out[0], error = out[1] or # output = out.first, error = out.last def capture_output require 'stringio' captured_stdout, captured_stderr = StringIO.new, StringIO.new orig_stdout, orig_stderr = $stdout, $stderr $stdout, $stderr = captured_stdout, captured_stderr begin yield ensure $stdout = orig_stdout $stderr = orig_stderr end return captured_stdout.string, captured_stderr.string end def capture_subprocess_output require 'tempfile' captured_stdout, captured_stderr = Tempfile.new("out"), Tempfile.new("err") orig_stdout, orig_stderr = $stdout.dup, $stderr.dup $stdout.reopen captured_stdout $stderr.reopen captured_stderr begin yield $stdout.rewind $stderr.rewind [captured_stdout.read, captured_stderr.read] ensure captured_stdout.unlink captured_stderr.unlink $stdout.reopen orig_stdout $stdout.reopen orig_stderr end end end include CaptureOutput end
Then include it in your test_helper.rb file with:
require './test/my_assertions.rb'
and use it in your tests like:
out = capture_output { method_called(prm1, prm2) } assert_match(/required_value/, out.first)