mud test
This command runs the tests in a MUD project. Internally, it runs the following steps:
- Starts an anvil(opens in a new tab) instance.
- Deploys the Worldand all relatedSystems usingmud deploy.
- Runs tests using forge test(opens in a new tab) and passes the deployed world address to the tests via theWORLD_ADDRESSenvironment variable.
Command line options
| Option | Meaning | Type | Default value | 
|---|---|---|---|
| --version | Show version number | boolean | false | 
| --configPath | Path to the config file | string | mud.config.ts | 
| --printConfig | Print the resolved config | boolean | false | 
| --saveDeployment | Save the deployment info to a file | boolean | true | 
| --profile | The foundry profile to use | string | local | 
| --srcDir | Source directory | string | Foundry srcdirectory | 
| --skipBuild | Skip rebuilding the contracts before deploying | boolean | false | 
| --alwaysRunPostDeploy | Run PostDeploy.s.solafter each deploy | boolean | false(run the script only when deploying a newWorld) | 
| --port | Port for the testing anvilinstance | number | 4242 | 
| --help | Show help | boolean | false | 
Examples
pnpm mud testWriting MUD tests
MUD test contracts inherit from MudTest (opens in a new tab).
This contract gets the World address from the $WORLD_ADDRESS environment variable and sets it as the Store address.
Line by line explanation of a test
This is an explanation of the test (opens in a new tab) for the React template (opens in a new tab) contracts.
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.21;
 
import "forge-std/Test.sol";
import { MudTest } from "@latticexyz/world/test/MudTest.t.sol";Import the general definitions required in all MUD tests.
import { IWorld } from "../src/codegen/world/IWorld.sol";
import { Tasks, TasksData } from "../src/codegen/index.sol";Import the definitions required for this test, the World we can access and the tables we'll use.
contract TasksTest is MudTest {
  function testWorldExists() public {MUD tests are Foundry tests (opens in a new tab).
Any public function that starts with test is a test that gets executed.
    uint256 codeSize;
    address addr = worldAddress;The World address comes from the MudTest (opens in a new tab).
    assembly {
      codeSize := extcodesize(addr)
    }
    assertTrue(codeSize > 0);
  }Use extcodesize (opens in a new tab) to get the size of the World contract.
If the deploy process failed, there wouldn't be any code there.
  function testTasks() public {
    // Expect task to exist that we created during PostDeploy script
    TasksData memory task = Tasks.get("1");Use the structure for a table entry's values that is created as part of code generation.
    assertEq(task.description, "Walk the dog");
    assertEq(task.completedAt, 0);Verify the information that is prepopulated by the PostDeploy.s.sol script (opens in a new tab).
    // Expect the task to be completed after calling completeTask from our TasksSystem
    IWorld(worldAddress).completeTask("1");Call a System to modify the table data.
    assertEq(Tasks.getCompletedAt("1"), block.timestamp);
  }
}Verify that the call changed the data correctly.