How Contracts Are Collected
For the declare
to work, snforge must collect and call build on
contracts in the package. By default, if using Scarb version >= 2.8.3, snforge will combine test
collection and contract collection steps.
When running snforge test
, snforge will, under the hood, call the scarb build --test
command. This command builds
all the test and contracts along them. Snforge collects these contracts and makes them available for declaring in tests.
Contracts are collected from both src
and tests
directory, including modules marked with #[cfg(test)]
.
Internally, snforge collects contracts from all [[test]]
targets compiled by Scarb.
You can read more about that in test collection documentation.
Collection Order
When multiple [[test]]
targets are present, snforge will first try to collect contracts from integration
test-type
target. If integration
is not present, snforge will first collect contracts from the first encountered [[test]]
target.
After collecting from initial [[test]]
target, snforge will collect contracts from any other encountered targets.
No specific order of collection is guaranteed.
📝 Note
If multiple contracts with the same name are present, snforge will use the first encountered implementation and will not collect others.
Using External Contracts in Tests
To use contract from dependencies in tests, Scarb.toml
must be updated to include these contracts under
[[target.starknet-contract]]
.
[[target.starknet-contract]]
build-external-contracts = ["path::to::Contract1", "other::path::to::Contract2"]
For more information about build-external-contracts
,
see Scarb documentation.