Skip to main content

expect_revert

def expect_revert(error_type: Optional[str] = None, error_message: Optional[str] = None) -> None: ...

If a code beneath expect_revert raises a specified exception, a test will pass. If not, a test will fail.

danger

Protostar always stops test case execution when a revert error is raised. The expect_revert cheatcode installs an assertion matching the caught error object, but it does not resume test execution in try/except-fashion.

info

Protostar displays an error type and a message when a test fails.

This test passes despite calling an uninitialized contract.
%lang starknet

@contract_interface
namespace BasicContract {
func increase_balance(amount: felt) {
}

func get_balance() -> (res: felt) {
}
}

@external
func test_failing_to_call_external_contract{syscall_ptr: felt*, range_check_ptr}() {
alloc_locals;

%{ expect_revert("UNINITIALIZED_CONTRACT") %}
BasicContract.increase_balance(contract_address=21, amount=3);

return ();
}
'except_revert' checks if the last error annotation contains 'error_message'.
%lang starknet

func inverse(x) -> (res: felt) {
with_attr error_message("x must not be zero. Got x={x}.") {
return (res=1 / x);
}
}

func assert_not_equal(a, b) {
let diff = a - b;
with_attr error_message("a and b must be distinct.") {
inverse(diff);
}
return ();
}

@external
func test_error_message{syscall_ptr: felt*, range_check_ptr}() {
%{ expect_revert(error_message="must be distinct") %}
assert_not_equal(0, 0);
return ();
}
tip

Use scope attributes to annotate a code block with an informative error message.