# How to test if msg.value is 1 ether in test

I have a function which mints when 1 eth is send to it. The function is

``````    function _mint() public payable{
require(msg.value == 1 ether , "Send more ethers: 1 ether is required");
require(balanceOf(msg.sender)==0, "You can not have more than 1 Land");
.........
}
``````

I want to write a test which checks if 1 eth is send to it or not. Please help if anyone can.

• You said you want a test, in mocha, to see if the user sent 1 ether. But this is confusing. Mocha is for testing if a function is properly working or not, and not to check if a user sent 1 ether. I will supose you want to know if the function worked correctly. So you need to do a test that sends less than 1 ether and see if it reverted, and then call the function passing more than 1 ether and see if the function passed. Is this what you want? Feb 16, 2022 at 12:38
• My function should accept exactly 1 ETH neither less nor more. Rest you got it right. Feb 16, 2022 at 12:54
• then you should check the balance of the contract before (the contract is an account, so it will have a balance), the balance of the contract after, and assert if the difference in balance 1 ether. Feb 16, 2022 at 13:00
• This is also a good solution. Thanks Feb 16, 2022 at 13:04

## 2 Answers

You got the right idea, just keep in mind ETH has 18 decimals.

``````require(msg.value >= 1 * 10**18, "Must send at least 1 ETH");
``````
• I want to write a test to validate this. How can I write this test logic in mocha? This is the question. Feb 16, 2022 at 12:09
• Solidity accepts the keyword ether and does the conversion Feb 16, 2022 at 12:32

Answer I finally figured it out. This is how I wrote test for this case.

``````describe("Amount Received",()=>{
it("Should only mint When 1 Eth is received",async()=>{
let v = await (contractInstance._mint({value:1}));
v.wait();
expect( v.value.toString()).to.equal("1");
})
});
``````

I'm checking for 1 WEI instead of 1 ETH in this case to avoid BigNumber Error.