Искам да допълня казаното от Петко - налага се да сложите в блок кода, който искате да проверите, че хвърля изключение. Това не е просто синтаксис.
Въпреки, че за изключения все още не сме говорили, обяснението е много просто и се корени в реда на изпълнение на кода. Това:
partition(-1).should raise_error
...няма да работи, просто защото извикваш should на резултата от изпълнението на partition(-1). Тоест, още преди да си казал should, partition е извикан и е предизвикал изкючение, заради което и тестът ти ще гръмне.
Затова пък тук expect се възползва от блоковете в Руби, за да отложи изпълнението на парче код. Кодът се парсва и се вика to на резултата от изпълнението на expect. Блокът се изпълнява със закъснение, като е обгърнат с клаузи, които прихващат определени изключения:
expect { partition(-10) }.to raise_error