РЕШЕНО
Вопрос 1: Я хочу написать тест для file_choice_reader в следующем классе.
Класс выводит список файлов определенных типов в командную строку и позволяет пользователю выбрать один из них, введя порядковый номер.
class File_chooser
#shortened for readability
def file_choice_suggester
file_list = file_list_generator
if file_list.count > 0
file_list.each_with_index do |file, index|
puts index.to_s + ' ' + file
end
else
puts 'Neither .fcv nor .tmpl nor .ipa nor .apf files in directory.'
end
file_list
end
def file_choice_reader
unless File.exists? 'Cookie.txt'
file_list = file_choice_suggester
puts 'Choose file by typing index number!'
chosen_file = STDIN.gets.chomp
if /[^0-9]/.match(chosen_file) || chosen_file.to_i >= file_list.count
abort ('No valid index number.')
else
chosen_file = chosen_file.to_i
end
cookie_writer( file_list[chosen_file].to_s )
system 'cls'
puts 'You chose file: ' + file_list[chosen_file].to_s
path_and_file = file_list[chosen_file].to_s
else
self.hints_hash = hints_hash.merge( 'cookie_del' => '* Change file by typing command: del Cookie.txt *' )
pre_chosen_file = File.read('Cookie.txt')
path_and_file = pre_chosen_file.chomp.to_s
end
path_and_file
end
end
Мой тест выглядит так (мне предлагается ввести номер индекса, но он все еще говорит, что вывод «»):
class TestFile_chooser < MiniTest::Unit::TestCase
def setup
@file_chooser = File_chooser.new
end
def test_file_choice_reader_produces_confirmation_output
assert_output( /You chose file/ ) { @file_chooser.file_choice_reader }
end
end
Вывод file_choice_reader всегда "". Как я могу добавить последовательность получения пользовательского ввода и/затем/измерения вывода?
Вопрос 2: Это короткий вопрос. Тот же тестовый класс, что и выше, также содержит
def test_file_choice_suggester_produces_output
assert_output( /apf|fcv|tmpl|ipa/ ) { @file_chooser.file_choice_suggester }
end
Этот тест проходит. Но это оставляет меня с «1 запуском, 2 утверждениями». Это оставляет меня озадаченным. Как 1 тест за 1 прогон может дать 2 (??) утверждения?
Буду очень рад помощи. Обсуждение minitest в Интернете, кажется, не охватывает эти вещи. Может быть, это слишком фундаментально?
(Я также благодарен за все другие замечания о коде в комментариях. Спасибо за помощь.)
ОБНОВЛЕНИЕ (Вопрос 1)
С помощью приведенного ниже ответа моя новейшая версия теста с использованием примера в http://www.ruby-doc.org/core-2.1.5/Module.html
@file_chooser.instance_eval do
self.create_method( :puts ) {|arg| printed = arg}
end
Тест прошел без ошибок... НО... мне ВСЕ ЕЩЕ пишет: "Опровержение не удалось. Сообщение не выдано".
Спасибо за помощь! Спасибо также за все подсказки, как это понять.
[Добавление сюда кода трудно прочитать в комментариях.]
ОБНОВЛЕНИЕ 2 (вопрос 1)
Я последовал совету по другому вопросу, чтобы явно потребовать драгоценный камень minitest. Я поместил это выше кода моего тестового файла:
require 'rubygems'
gem 'minitest'
require 'minitest/autorun'
require_relative 'falcon'
(Если это избыточно, пожалуйста, дайте мне знать.)
Следующий тестовый код больше не выдает ни ошибки, ни сбоя:
def test_file_choice_suggester_produces_output
assert_output( /apf|fcv|tmpl|ipa/ ) { @file_chooser.file_choice_suggester }
end
Спасибо всем за вашу помощь!
assert_output
, который делает несколько утверждений. Или если у вас есть оба этих теста в одном файле. - person Josh Bodah   schedule 12.11.2014