Event testing helps you check if your blockchain program sends the right signals when something important happens. It makes sure your program talks correctly with other parts.
Event testing in Blockchain / Solidity
expectEvent(receipt, 'EventName', { param1: value1, param2: value2 });const receipt = await contract.doSomething(); expectEvent(receipt, 'ActionDone', { user: userAddress });
const receipt = await contract.transfer(to, amount); expectEvent(receipt, 'Transfer', { from: sender, to: to, value: amount });
This test deploys a contract, calls a function that triggers an event, and checks if the event 'EventTest' was emitted with the value 42.
const { expectEvent } = require('@openzeppelin/test-helpers');
const MyContract = artifacts.require('MyContract');
contract('MyContract', accounts => {
it('should emit EventTest with correct value', async () => {
const instance = await MyContract.new();
const receipt = await instance.triggerEvent(42);
expectEvent(receipt, 'EventTest', { value: '42' });
});
});Event parameters are often strings in tests, so numbers may need to be converted to strings.
Always check the event name and parameter names exactly as defined in your contract.
Event testing confirms your blockchain contract sends the right signals.
Use event testing to catch errors and verify contract behavior.
Testing frameworks like Truffle and Hardhat provide easy ways to check events.
Practice
What is the main purpose of event testing in blockchain smart contracts?
Solution
Step 1: Understand event testing purpose
Event testing focuses on confirming that smart contracts emit the right signals (events) when certain actions happen.Step 2: Compare options with event testing goal
Only To verify that the contract emits the correct events during execution matches this purpose, as it talks about verifying emitted events.Final Answer:
To verify that the contract emits the correct events during execution -> Option AQuick Check:
Event testing = Verify emitted events [OK]
- Confusing event testing with gas optimization
- Thinking event testing checks UI elements
- Assuming event testing measures storage use
Which of the following is the correct syntax to listen for an event named Transfer in a Solidity test using JavaScript?
contractInstance.Transfer({fromBlock: 0, toBlock: 'latest'}).???Solution
Step 1: Recall event listening syntax in Solidity tests
In older Solidity test frameworks,watchis used to listen for events on contract instances.Step 2: Match options with correct method
Onlywatchfits the syntax shown;on,emit, andlistenare incorrect here.Final Answer:
watch -> Option BQuick Check:
Event listening method = watch [OK]
- Using 'emit' which triggers events, not listens
- Confusing 'on' with event listening in other frameworks
- Using 'listen' which is not a Solidity test method
Given this Solidity event and test snippet, what will be the output of console.log(events.length) after calling transfer() once?
event Transfer(address indexed from, address indexed to, uint amount);
// In test:
const events = await contractInstance.getPastEvents('Transfer', {fromBlock: 0, toBlock: 'latest'});
await contractInstance.transfer(receiver, 100);
console.log(events.length);Solution
Step 1: Understand event fetching timing
ThegetPastEventscall happens beforetransfer(), so it fetches events before the transfer.Step 2: Analyze event count after transfer
Since events are fetched before the transfer,events.lengthwill be 0 because no Transfer event happened yet.Final Answer:
0 -> Option CQuick Check:
Events fetched before transfer = 0 [OK]
- Assuming events array updates automatically
- Ignoring async order of calls
- Expecting event count before event occurs
Identify the error in this test code snippet that listens for an event Approval:
contractInstance.Approval().watch((error, event) => {
if (!error) {
console.log('Approval event:', event);
}
});Solution
Step 1: Check event listening syntax
The event constructor requires a filter object parameter (e.g., {fromBlock: 0}) to specify the event scope.Step 2: Identify correct usage
The correct syntax iscontractInstance.Approval({fromBlock: 0}).watch(...); the code uses emptyApproval().Final Answer:
Missing event filter parameters in the call -> Option DQuick Check:
Event filter params required [OK]
- Omitting filter parameters in event call
- Confusing callback parameters
- Mixing event listening methods
You want to test that a Deposit event is emitted only when the deposit amount is greater than zero. Which test approach correctly verifies this?
1. Call deposit(0) and check no event emitted 2. Call deposit(100) and check event emitted with amount 100 3. Call deposit(-50) and check event emitted 4. Call deposit(100) and check event emitted with amount 0
Solution
Step 1: Understand event emission condition
The event should emit only if deposit amount > 0, so deposit(0) should emit no event, deposit(100) should emit event with amount 100.Step 2: Evaluate test steps
Step 3 calls deposit(-50), which is invalid (negative deposit), so event emission is not expected. Step 4 expects event with amount 0, which contradicts the condition.Final Answer:
Only steps 1 and 2 are correct test cases -> Option AQuick Check:
Test event only for positive deposits [OK]
- Testing negative amounts which are invalid
- Expecting event with zero amount
- Assuming all deposits emit events
Ready to prove it?
Pass the test and this pattern moves unknown
