Setting up Tests for Your Pallet
Goal
Learn how to setup the scaffolding required to write tests for your pallet.
Use Cases
Writing and running unit tests for a pallet.
Overview
This guide steps through how to use mock.rs and test.rs as a basis for
testing your pallet. We'll be using the node template for the scaffolding of the mock.rs
file and an arbitrary pallet — called pallet-testing — to give this guide some
context. This pallet will contain a single function called add_value, that takes an origin
and a u32 and returns Ok(()) if the value is less than or equal to a constant called
MaxValue that we specify in the mock runtime.
Steps
1. Use the template node as boilerplate
Inside pallet-testing/src, the first thing we need to do is create two empty files: mock.rs and tests.rs.
Paste in the contents from template/src/mock.rs. We'll use this as boilerplate
which we'll customize for our pallet-testing pallet.
2. Create a mock runtime to test your pallet
Start by modifying pallet-testing/src/mock.rs to include the pallet-testing pallet. This involves changes in the following code sections:
Dependencies
Replace the first line with the name of the pallet, in our case pallet_testing:
use crate as pallet_testing;
/*--snip--*/
Configure the mock runtime
In frame_support::construct_runtime!, replace pallet_template with the name of your pallet, in our
case pallet_testing:
/*--snip--*/
TestingPallet: pallet_testing::{Pallet, Call, Storage, Event<T>},
/*--snip--*/
Implement your pallet for the mock runtime
Replace impl pallet_template::Config for Test {...} with your configuration types and any
constant values your pallet requires:
parameter_types! {
pub const MaxValue: u32 = 50;
}
impl pallet_testing::Config for Test {
type Event = Event;
type MaxValue = MaxValue;
}
To put the mock runtime to use, we need to set up our tests.rs file for the pallet-testing pallet.
3. Setup and create tests
In tests.rs, start by importing the dependencies you'll need from lib.rs using super:
use super::*;
Testing that errors work
This will test whether the error works as intended:
#[test]
fn error_works(){
new_test_ext().execute_with(|| {
assert_err!(
TestingPallet::add_value(Origin::signed(1), 51),
"value must be <= maximum add amount constant"
);
})
}
Testing known working case
Create a test that should work:
#[test]
fn test_should_work() {
new_test_ext().execute_with(|| {
assert_ok!(
TestingPallet::add_value(Origin::signed(1), 10)
);
})
}
Testing known failing case
And another that should fail:
#[test]
fn test_should_fail() {
new_test_ext().execute_with(|| {
assert_ok!(
TestingPallet::add_value(Origin::signed(1), 100)
);
})
}
4. Run your tests
Execute the following command from your pallet's directory:
cargo test
Examples
- tests in
pallet_template - tests in the
reward-coinexample pallet