Führen Sie einen einzelnen Hardhat-Test durch

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);
  });
});

itsWie kann ich jeweils nur eine davon testen ?

In Mocha können Sie mit dem --grepBefehl 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"
Woah! Der berühmte Patrick Collins stellt Fragen zu Stack Overflow? Ich denke, es ist eine gute Erinnerung daran, dass wir alle immer neue Dinge lernen.
Ich versuche, in Foren immer direkte technische Fragen zu stellen, wenn ich die Antworten nicht sofort finde. Auf diese Weise werden sie von Suchmaschinen indexiert, damit ich und andere beim nächsten Mal die Antworten schnell finden können. Und so zu tun, als wüsste man alles, ist unaufrichtig.

Antworten (5)

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 testund es wird nur dieser Testsatz ausgeführt.

Wenn Sie nur eins wollen , können Sie itanstelle .only()von on verwenden .describeit.only()

BEARBEITEN:

Ab Hardhat-Version 2.9 können Sie --grepwie in der ursprünglichen Frage beschrieben verwenden.

Das ist großartig, aber es gibt keinen Befehlszeilenteil, den ich ausführen kann? Ich muss meinen Code jedes Mal bearbeiten, wenn ich nur 1 Test ausführen möchte?
@PatrickCollins ja, denn so funktioniert Mocha. Ich bin mir nicht sicher, ob Sie den Test Runner mit Hardhat ändern können, aber wenn Sie können, beachten Sie, dass Sie mit Jest und Earl.js bestimmte Tests über die Befehlszeile ausführen können.
Alles klar, danke für die Info. Scheint, als wäre dies eine schöne Verbesserung für Mokka.
Sie können Mocha's verwenden --grep, um Tests nach ihrer Beschreibung zu filtern. Ich persönlich denke, dass das Hinzufügen .onlyeinfach einfacher ist, aber YMMV.
Oh, und denken Sie daran, dass dies (noch) npx hardhat testnicht unterstützt wird . Wenn Sie es also verwenden möchten, müssen Sie Mocha direkt ausführen, anstatt die Testaufgabe zu verwenden.--grep
Wenn ich "describe.only" mit Hardhat verwende, findet der Testläufer nichts ...
@Jim bitte erstellen Sie eine Frage, damit Sie Code einfügen können und wir weiter helfen können

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. addWenn 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",

Aber Sie müssen immer noch das .onlyJa verwenden?
So wie es derzeit geschrieben steht, ist Ihre Antwort unklar. Bitte bearbeiten Sie, um zusätzliche Details hinzuzufügen, die anderen helfen zu verstehen, wie dies die gestellte Frage beantwortet. Weitere Informationen zum Verfassen guter Antworten finden Sie in der Hilfe .

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, .onlyoder fit/ fdescribeinnerhalb einer einzigen Datei großartig funktionieren.

Wenn Sie mehrere Dateien haben, können Sie hardhat test ./test/testfile.js.

.onlyoder fitfunktioniert nicht, wenn Sie mehrere Testdateien gleichzeitig ausführen.

Wenn ich hardhat test ./test/testfile.jsdie Ausgabe ausführe, wird angezeigt, dass keine Tests in der Datei gefunden wurden ...