Ответ 1
Вы можете динамически определять методы.
В следующем примере 6 тестов динамически создаются (2 теста для каждого из 3 тестируемых значений). Это означает, что если что-то не удается, другие тесты все еще выполняются.
require "minitest/autorun"
class MyTests < MiniTest::Unit::TestCase
['0', '1111111', '2222222'].each do |phone_number|
define_method("test_#{phone_number}_has_7_characters") do
assert_equal(7, phone_number.length)
end
define_method("test_#{phone_number}_starts_with_1") do
assert_equal('1', phone_number[0])
end
end
end
Применимый тестовый пример дает следующие результаты:
# Running tests:
F..F.F
Finished tests in 0.044004s, 136.3512 tests/s, 136.3512 assertions/s.
1) Failure:
test_0_starts_with_1(MyTests) [stuff.rb:13]:
Expected: "1"
Actual: "0"
2) Failure:
test_0_has_7_characters(MyTests) [stuff.rb:9]:
Expected: 7
Actual: 1
3) Failure:
test_2222222_starts_with_1(MyTests) [stuff.rb:13]:
Expected: "1"
Actual: "2"
6 tests, 6 assertions, 3 failures, 0 errors, 0 skips
Применяя ту же концепцию к вашим тестам, я думаю, что вы хотите:
class MyTests < MiniTest::Unit::TestCase
listOfPhoneNumbersForTesting.each do |phone|
define_method("test_#{phone}") do
TestPhone.new phone
end
end
end
Аналогичный подход может быть применен при использовании тестов spec-style:
require 'minitest/spec'
require 'minitest/autorun'
describe "my tests" do
['0', '1111111', '2222222'].each do |phone_number|
it "#{phone_number} has 7 characters" do
assert_equal(7, phone_number.length)
end
it "#{phone_number} starts with 1" do
assert_equal('1', phone_number[0])
end
end
end
ВАЖНО: Следует отметить, что вам нужно убедиться, что имя созданных методов тестирования уникально для каждого тестового примера.
Например, если вы не поместите номер телефона в имя метода, вы в конечном итоге перепишете ранее определенные методы. В конечном итоге это означает, что тестируется только последний номер телефона.
Это связано с тем, что MiniTest генерирует методы тестирования "на лету" и перезаписывает уже сгенерированные методы тестирования, в конечном счете используя только последнюю переменную .each.