Вот решение вашей конкретной проблемы. Идея состоит в том, чтобы создать метод класса (например, контекст, настройка и необходимость Следует).
Инкапсулируйте повторение в методе класса, принимая все переменные части в качестве аргументов, подобных этому:
def self.should_get_unit_amount_and_name_from_string(unit, amount, name, string_to_analyze)
context string_to_analyze do
setup do
@ingredient = Ingredient.create(:ingredient_string => string_to_analyze)
end
should "return unit" do
assert_equal @ingredient.unit, unit
end
should "return amount" do
assert_equal @ingredient.amount, amount
end
should "return name" do
assert_equal @ingredient.name, name
end
end
end
Теперь вы можете вызывать все эти инкапсулированные тесты с одним вкладышем (5-вкладышем для удобства чтения; -)
context "Create ingredient from string" do
should_get_unit_amount_and_name_from_string(
'cups',
1.0,
'butter',
"1 cups butter")
should_get_unit_amount_and_name_from_string(
'(18.25 ounce) package',
1.0,
'devil\'s food cake mix with pudding',
"1 (18.25 ounce) package devil's food cake mix with pudding")
end
В некоторых случаях вы можете захотеть принять блок, который может служить вашей настройкой Следует.