Ich habe eine Testdatei in Hardhat wie folgt:
const { expect } = require("chai");
describe("contract tests", function () {
it("does function one", async function () {
expect(await someContract.someFunc()).to.equal(something);
});
it("does function two", async function () {
expect(await someContract.someOtherFunction()).to.equal(somethingOtherThing);
});
});
its
Wie kann ich jeweils nur eine davon testen ?
In Mocha können Sie mit dem --grep
Befehl einen einzelnen Test ausführen. Gibt es etwas ähnliches für Hardhats?
Etwas wie:
npx hardhat test --grep "does function one"
oder
npx hardhat test --grep "does function two"
Verwenden Sie .only()
. Ihre Testdatei würde beispielsweise so aussehen:
const { expect } = require("chai");
describe.only("contract tests", function () {
it("does function one", async function () {
expect(await someContract.someFunc()).to.equal(something);
});
it("does function two", async function () {
expect(await someContract.someOtherFunction()).to.equal(somethingOtherThing);
});
});
und dann können Sie ausführen npx hardhat test
und es wird nur dieser Testsatz ausgeführt.
Wenn Sie nur eins wollen , können Sie it
anstelle .only()
von on verwenden .describe
it.only()
BEARBEITEN:
Ab Hardhat-Version 2.9 können Sie --grep
wie in der ursprünglichen Frage beschrieben verwenden.
--grep
, um Tests nach ihrer Beschreibung zu filtern. Ich persönlich denke, dass das Hinzufügen .only
einfach einfacher ist, aber YMMV.npx hardhat test
nicht unterstützt wird . Wenn Sie es also verwenden möchten, müssen Sie Mocha direkt ausführen, anstatt die Testaufgabe zu verwenden.--grep
Sie werden froh sein zu wissen, dass ab Hardhat 2.9 der Parameter der Aufgabe--grep
hinzugefügt wurde ! Dies fügt die Möglichkeit hinzu, einen regulären Ausdruck an mocha weiterzugeben! Das ist cool, weil du es kannsttest
Übereinstimmung mit einem einzelnen Teil des Tests. In Ihrem Beispiel Patrick, um den ersten Test auszuführen:
npx hardhat test --grep one
würde den Trick machen.
Noch cooler ist das Abgleichen verschiedener Tests. add
Wenn Sie alle Übereinstimmungen für Tests mit und testen möchten convert
, lautet der Befehl:
npx hardhat test --grep "add|con?vert"
würde mit allen untenstehenden Tests in unserer "Mock"-Testsuite übereinstimmen.
describe('Mocha', function () {
describe('"grep" option', function () {
it('should add a RegExp to the mocha.options object', function () {});
it('should convert string to a RegExp', function () {});
});
describe('"fgrep" option', function () {
it('should escape and convert string to a RegExp', function () {});
});
describe('.grep()', function () {
it('should add a RegExp to the mocha.options object', function () {});
it('should convert grep string to a RegExp', function () {});
it('should covert grep regex-like string to a RegExp', function () {});
});
});
Warum die ?
? Nun, es macht das optional und ich wollte einen mit einem kleinen Tippfehlern
abgleichen .
Ich werde posten, da dies nicht die beste Option ist. Sie können https://www.npmjs.com/package/hardhat-watcher verwenden. Ich starte es dann als neuen package.json-Eintrag:
"watch-test": "hardhat watch test",
.only
Ja verwenden?Wenn Ihre Tests spezifisch für die Hardhat-Konfiguration sind, wie im CLI-Befehl angegeben, können Sie die CLI-Eingabe direkt in der Testdatei parsen. Dann könnten Sie Mocha's verwenden, .skip()
um bestimmte konfigurationsbasierte Bedingungen zu ignorieren.
Ich habe dies wie im folgenden Beispiel basierend auf der Netzwerkauswahl angewendet:
Paket.json
{
...,
"scripts": {
"test": "hardhat test --network localhost",
"test-hardhat": "hardhat test --network hardhat",
"test-net": "hardhat test --network rinkeby"
},
sample-test.js
const { assert } = require('chai');
const PARMS = process.argv;
const NETWORK = PARMS[PARMS.indexOf('--network') + 1];
describe('ModifyVariable', function () {
let contract;
const inputStr = 'Applesauce';
before(async () => {
const ModifyVariable = await ethers.getContractFactory('ModifyVariable');
contract = await ModifyVariable.deploy(10, inputStr);
await contract.deployed();
});
// Maybe I'll run this. Maybe I won't...
it('should change x to 1337', async function () {
if (NETWORK === 'localhost') this.skip();
await contract.modifyToLeet();
const newX = await contract.x();
assert.equal(newX.toNumber(), 1337);
});
// Always test rename to 'Bob'.
it('should change publicString to "Bob"', async () => {
await contract.modifyToBob();
const newPublicString = await contract.publicString();
assert.equal(newPublicString, 'Bob');
});
});
describe('ModifyVariable', function () {
let contract;
const inputStr = 'Applesauce';
// Maybe I'll run this. Maybe I won't...
before(async function () {
if (NETWORK === 'localhost') this.skip();
const ModifyVariable = await ethers.getContractFactory('ModifyVariable');
contract = await ModifyVariable.deploy(10, inputStr);
await contract.deployed();
});
it(`should change publicString to "${inputStr}"`, async () => {
await contract.modifyToInput(inputStr);
const newPublicString = await contract.publicString();
assert.equal(newPublicString, inputStr);
})
});
Ausgang
$ npm run test
> hardhat-project1@1.0.0 test
> hardhat test --network localhost
ModifyVariable
- should change x to 1337
√ should change publicString to "Bob" (2157ms)
ModifyVariable
- should change publicString to "Applesauce"
1 passing (3s)
2 pending
Für alle, die dies finden und ein ähnliches Problem wie ich haben, .only
oder fit
/ fdescribe
innerhalb einer einzigen Datei großartig funktionieren.
Wenn Sie mehrere Dateien haben, können Sie hardhat test ./test/testfile.js
.
.only
oder fit
funktioniert nicht, wenn Sie mehrere Testdateien gleichzeitig ausführen.
hardhat test ./test/testfile.js
die Ausgabe ausführe, wird angezeigt, dass keine Tests in der Datei gefunden wurden ...
Tomiwa
Patrick Collins