Mock Smart Contract für Unit-Tests

Ich bin neu bei Ethereum und Solidity, ich entwickle eine einfache dezentrale Anwendung mit Truffle, wo ich einen abstrakten Vertrag Storageund einen anderen Vertrag habe Reader, der Speicher verwendet.

contract Storage {
    function getWeight() public view returns(uint8);
    function setWeight(uint8 weight) public view returns(bool); 
}

contract Reader {
    Storage private storage;
    constructor(address storageAddress) {
        storage = Storage(storageAddress);
    }
}

Ich versuche, einen Komponententest für den Vertrag zu schreiben. Gibt Readeres überhaupt eine Möglichkeit, das Verhalten des abstrakten Vertrags zu verspotten? Wenn nicht, was sind dann die Best Practices für diese Situation?

Antworten (2)

Ich habe eine kleine Implementierung des Speichervertrags erstellt. Beachten Sie, dass ich Ihre Abstraktion in StorageInterface umbenannt habe.

Ich habe auch einige Funktionen zu Reader hinzugefügt, da es nicht viel zu testen gibt, es sei denn, es tut etwas. Jetzt haben Sie also einen Setter/Getter im Reader, der an einen Speichervertrag weiterleitet, der eine Implementierung der Schnittstelle ist.

Als ich es mir ansah, entschied ich, dass mir die Verwendung von "Storage" unangenehm war, da dies ein reserviertes Wort in Kleinbuchstaben ist. uint8Auch auf die nach vorzeitiger Optimierung aussehende Optimierung habe ich verzichtet .

Noch eine Kleinigkeit. Die Schnittstelle hat den Setter als deklariert view, kann dies jedoch nicht sein, da sie in den Vertragsstatus schreibt.

pragma solidity 0.4.24;

contract StoreInterface {
    function getWeight() public view returns(uint);
    function setWeight(uint weight) public returns(bool); 
}

/**
 * Just a very simple set of stubs ...
 * Deploy a "Store" and then pass its address into Reader's constructor.
 */

contract Store is StoreInterface {

    uint weight;

    event LogSetWeight(address sender, uint weight);

    function getWeight() public view returns(uint) {
        return weight;
    }

    function setWeight(uint _weight) public returns(bool) {
        weight = _weight;
        emit LogSetWeight(msg.sender, _weight);
        return true;
    } 
}

contract Reader {

    StoreInterface store;

    constructor(address storeAddress) public {
        store = StoreInterface(storeAddress);
    }

    function getWeight() public view returns(uint) {
        return store.getWeight();
    }

    function setWeight(uint weight) public returns(bool) {
        return store.setWeight(weight);
    }
}

Ich hoffe es hilft.

Der andere Ansatz wäre, eine spöttische Bibliothek wie Doppelganger zu verwenden