Hardhat Error – Testing Error Thrown with Hardhat

etherhardhatmocha

How would you test the following function with solidity v0.7 and hardhat v2.3.3?

function myFunction(int8 _num) public {
        require(_num > 5, "Num should be bigger than 5");
        ...
}

I've tried:

try {
         await contract.myFunction(3);
} catch(error) {
         expect(error).to.equals("Num should be bigger than 5");
};

And also:

expect.fail(await contract.myFunction(3));

But I always get:

Error: VM Exception while processing transaction: revert Num should be bigger than 5

Which seems to me the Virtual Machine breaking off with the test failing in the spot, without even having the chance to catch the error.

Best Answer

When I test a function for revert I do the following in my javascript test file (e.g. myContractTest.js):

const { expect } = require('chai');
const { ethers } = require('hardhat');
const { BigNumber } = require('ethers');

describe('Test contract', () => {
    it('deploy the smart contract and reverts', async () => {
        const MyContract = await ethers.getContractFactory('MyContract');
        const contractInstance = await MyContract.deploy(<add something if you have parameters in the constructor>);
        await expect(contractInstance.myFunction(BigNumber.from('6')))
        .to.be.revertedWith('Num should be bigger than 5');
    });
});

Then Run

npx hardhat test --network hardhat ./test/myContractTest.js

Documentation here: https://ethereum-waffle.readthedocs.io/en/latest/matchers.html#revert-with-message

Related Topic