Hi everbody,
So far I've been following the guides on your webpage for writing Smart contracts, deploying and testing them. But now, my first tests are unsuccessful.
I used the Openzeppelin Test Environment and mocha chai as a tester. I don't use truffle so I setup a test configuration file in my main project folder that uses web3. I wrote the code for the test and run with npm test. This is the error I receive:
openzepper@1.0.0 test /home/user/Documents/Openzepp1/Openzeppelin1_git
mocha --exit --recursive test
ReferenceError: Web3 is not defined
at Object.<anonymous> (/home/user/Documents/Openzepp1/Openzeppelin1_git/test/Box.test.js:8:14)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Module.require (internal/modules/cjs/loader.js:692:17)
at require (internal/modules/cjs/helpers.js:25:18)
at /home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/mocha/lib/mocha.js:314:36
at Array.forEach (<anonymous>)
at Mocha.loadFiles (/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/mocha/lib/mocha.js:311:14)
at /home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/mocha/lib/mocha.js:347:12
at new Promise (<anonymous>)
at Mocha.loadFilesAsync (/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/mocha/lib/mocha.js:346:12)
at singleRun (/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/mocha/lib/cli/run-helpers.js:107:15)
at exports.runMocha (/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/mocha/lib/cli/run-helpers.js:144:11)
at Object.exports.handler (/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/mocha/lib/cli/run.js:306:11)
at Object.runCommand (/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/yargs/lib/command.js:242:26)
at Object.parseArgs [as _parseArgs] (/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/yargs/yargs.js:1096:28)
at Object.parse (/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/yargs/yargs.js:575:25)
at Object.exports.main (/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/mocha/lib/cli/cli.js:68:6)
at Object.<anonymous> (/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/mocha/bin/mocha:133:29)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
npm ERR! Test failed. See above for more details.
user@Ethereum:~/Documents/Openzepp1/Openzeppelin1_git$
/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/ganache-core/lib/subproviders/geth_api_double.js:39
callback(self.initialization_error, self.state);
^
TypeError: Cannot read property 'port' of null
at /home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/@openzeppelin/test-environment/src/ganache-server.ts:36:51
at Immediate.<anonymous> (/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/ganache-core/lib/subproviders/geth_api_double.js:39:9)
at runCallback (timers.js:705:18)
at tryOnImmediate (timers.js:676:5)
at processImmediate (timers.js:658:5)
Seems like it can't find Web3 and can't connect to the network. I define Web3 and tell it to use the local ganache provided by the test environment this way:
// test/Box.test.js
// Load dependencies
const { accounts, contract } = require('@openzeppelin/test-environment');
const { expect } = require('chai');
const web3 = new Web3('@openzeppelin/test-environment');
const loader = setupLoader({ provider: web3 }).web3;
I guess this is false. Can anybody point me into the right direction?
1 Like
Hi @tschilpi,
Welcome to the community 
I am sorry that you are having issues with your tests.
I would recommend looking at the OpenZeppelin Learn guides on Writing Automated Smart Contract Tests
To get a web3
instance from the local blockchain in OpenZeppelin Test Environment you can use the following:
const { accounts, contract, web3 } = require('@openzeppelin/test-environment');
See the API: https://docs.openzeppelin.com/test-environment/0.1/api#web3
Hi @abcoathup,
Thanks for your warm welcome.
I’ve been using the API and all the documentation you have but couldn’t figure it out.
The Box.contract works fine on a local ganache address. I can store a value and retrieve it.
This is the test code I’ve been using to test it, it is straight from your ‘‘Writing Automated Smart Contract Tests’’ guide:
// test/Box.test.js
// Load dependencies
const { accounts, contract, web3 } = require('@openzeppelin/test-environment');
const { expect } = require('chai');
// Load compiled artifacts
const Box = contract.fromArtifact('Box');
// Start test block
describe('Box', function () {
const [ owner ] = accounts;
beforeEach(async function () {
// Deploy a new Box contract for each test
this.contract = await Box.new({ from: owner });
});
// Test case
it('retrieve returns a value previously stored', async function () {
// Store a value - recall that only the owner account can do this!
await this.contract.store(42, { from: owner });
// Test if the returned value is the same one
// Note that we need to use strings to compare the 256 bit integers
expect((await this.contract.retrieve()).toString()).to.equal('42');
});
});
And this is the error I receive:
> openzepper@1.0.0 test /home/user/Documents/Openzepp1/Openzeppelin1_git
> mocha --exit --recursive test
Box
1) "before each" hook for "retrieve returns a value previously stored"
0 passing (25ms)
1 failing
1) Box
"before each" hook for "retrieve returns a value previously stored":
TypeError: Box.new is not a function
at Context.<anonymous> (test/Box.test.js:17:34)
npm ERR! Test failed. See above for more details.
user@Ethereum:~/Documents/Openzepp1/Openzeppelin1_git/test$
/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/ganache-core/lib/subproviders/geth_api_double.js:39
callback(self.initialization_error, self.state);
^
TypeError: Cannot read property 'port' of null
at /home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/@openzeppelin/test-environment/src/ganache-server.ts:36:51
at Immediate.<anonymous> (/home/user/Documents/Openzepp1/Openzeppelin1_git/node_modules/ganache-core/lib/subproviders/geth_api_double.js:39:9)
at runCallback (timers.js:705:18)
at tryOnImmediate (timers.js:676:5)
at processImmediate (timers.js:658:5)
I don’t understand why it says that ‘‘Box.new is not a function’’.
1 Like
Hi @tschilpi,
I wasn’t able to reproduce. I can run the test without any issues.
Can you advise the versions that you are using?
I am running on WSL2 on Windows 10, node v10.19.0, npm 6.14.5, OpenZeppelin CLI 2.8.2.
Hi @abcoathup
I am running Ubuntu 18.04.4 on a Ethereum Virtual Machine, with node v10.20.1, npm v6.14.4 and Openzeppelin CLI 2.8.2.
1 Like
Hi @tschilpi,
It sounds like we are on similar environments.
Other than having to install npm i @truffle/debug-utils
(https://github.com/OpenZeppelin/openzeppelin-test-environment/issues/105) I didn’t have an issue running the test.
Would you mind creating a new project and trying again.
Test run
$ npm run test
> tschilpi@1.0.0 test /home/abcoathup/projects/forum/tschilpi
> mocha --exit --recursive test
Box
✓ retrieve returns a value previously stored (102ms)
1 passing (714ms)
Box.sol
// contracts/Box.sol
pragma solidity ^0.5.0;
contract Box {
uint256 private value;
// Emitted when the stored value changes
event ValueChanged(uint256 newValue);
// Stores a new value in the contract
function store(uint256 newValue) public {
value = newValue;
emit ValueChanged(newValue);
}
// Reads the last stored value
function retrieve() public view returns (uint256) {
return value;
}
}
Box.test.js
// test/Box.test.js
// Load dependencies
const { accounts, contract, web3 } = require('@openzeppelin/test-environment');
const { expect } = require('chai');
// Load compiled artifacts
const Box = contract.fromArtifact('Box');
// Start test block
describe('Box', function () {
const [ owner ] = accounts;
beforeEach(async function () {
// Deploy a new Box contract for each test
this.contract = await Box.new({ from: owner });
});
// Test case
it('retrieve returns a value previously stored', async function () {
// Store a value - recall that only the owner account can do this!
await this.contract.store(42, { from: owner });
// Test if the returned value is the same one
// Note that we need to use strings to compare the 256 bit integers
expect((await this.contract.retrieve()).toString()).to.equal('42');
});
});