如何用Python向Starknet Cairo合约函数传入地址进行单元测试?
在Cairo合约单元测试中用Python传入账户地址的方法
在Cairo的Python测试框架里,账户地址本质是felt类型(对应Python的整数),你可以通过两种方式给合约函数传地址:生成测试账户获取地址,或者直接使用自定义整数值。以下是具体操作和代码示例:
1. 生成测试账户并传入地址
通过Starknet.deploy_account()可以创建测试用的账户实例,其address属性就是可直接传给合约的地址值,适合模拟真实账户调用场景的测试。
import pytest from starkware.starknet.testing.starknet import Starknet @pytest.mark.asyncio async def test_authorized_management(): # 初始化测试环境 starknet = await Starknet.empty() # 创建两个测试账户 authorized_account = await starknet.deploy_account() random_account = await starknet.deploy_account() # 部署你的授权管理合约 auth_contract = await starknet.deploy("contracts/authorization.cairo") # 调用合约的添加授权函数,传入测试账户地址 await auth_contract.add_authorized(authorized_account.address).invoke() # 验证地址已被授权 check_result = await auth_contract.is_authorized(authorized_account.address).call() assert check_result.result == (1,) # 验证未授权地址的状态 check_result = await auth_contract.is_authorized(random_account.address).call() assert check_result.result == (0,)
2. 使用自定义地址值
如果不需要完整的账户实例,仅需传入地址参数,直接用整数表示即可(Cairo的felt类型与Python int完全兼容),适合快速测试特定地址的场景。
@pytest.mark.asyncio async def test_custom_address_input(): starknet = await Starknet.empty() auth_contract = await starknet.deploy("contracts/authorization.cairo") # 自定义一个地址(用十六进制或十进制整数均可) test_address = 0x123456789ABCDEF0123456789ABCDEF # 传入自定义地址到合约函数 await auth_contract.add_authorized(test_address).invoke() # 验证授权状态 check_result = await auth_contract.is_authorized(test_address).call() assert check_result.result == (1,)
3. 测试带modifier的函数
如果合约里有only_authorized这类需要验证调用者地址的modifier,测试时可以通过invoke(sender=address)指定调用方地址,模拟不同账户的调用行为:
@pytest.mark.asyncio async def test_only_authorized_modifier(): starknet = await Starknet.empty() auth_contract = await starknet.deploy("contracts/authorization.cairo") allowed_account = await starknet.deploy_account() # 先将账户加入授权列表 await auth_contract.add_authorized(allowed_account.address).invoke() # 用授权账户调用受限制函数(成功执行) await auth_contract.restricted_operation().invoke(sender=allowed_account.address) # 用未授权账户调用,预期触发错误 blocked_account = await starknet.deploy_account() try: await auth_contract.restricted_operation().invoke(sender=blocked_account.address) assert False, "未捕获到未授权调用的错误" except Exception as e: assert "Unauthorized" in str(e)
内容的提问来源于stack exchange,提问作者DarkShark
相关产品推荐
相关产品推荐

