So debuggen Sie Zuordnungen von Strukturen in Trüffeltests

Dies ist meine Testdatei:

pragma solidity ^0.4.24;

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/Salaries.sol";

contract TestSalaries {

    function testEmployeeInsertion() public {
        Salaries salaries = Salaries(DeployedAddresses.Salaries());
        address addr = address(0);
        salaries.addEmployee(address(0), "Alicia Drake", "Lead Engineer");
        Assert.equal(salaries.employees(addr).name, "Alicia Drake");
    }
}

Und die Definitionen in Salaries.sol:

struct Employee {
    string name;
    string role;
}
mapping (address => Employee) public employees;

Wie kann ich Tests schreiben, um den Namen und die Rolle des Mitarbeiters zu verifizieren? Aktuell bekomme ich folgenden Fehler:

TypeError: Indexed expression has to be a type, mapping or array (is tuple(string memory,string memory))
        Assert.equal(salaries.employees(addr)[0], "Alicia Drake");

Gibt es eine Möglichkeit, die Variablen in der Konsole zu protokollieren, während die Tests ausgeführt werden?

Verwenden truffle 4.1.14.

Eine Problemumgehung bei der Verwendung von Solidity besteht darin, Ereignisse als Nachrichten auszugeben, z. B. Ereigniskonsolenprotokoll (Zeichenfolgentest) oder Ereigniskonsolenprotokoll (Zeichenfolgenname), aber dieser Ansatz ist etwas unflexibel. Ich glaube, dass Javascript-Tests flexibler bei der Protokollierung sind.

Antworten (2)

Um truffleTests zu debuggen, ist es viel bequemer, Tests hineinzuschreibenjavascript

In Ihrem Fall müssen Sie []stattdessen verwenden()

salaries.employees[addr].name

https://solidity.readthedocs.io/en/v0.4.21/types.html#mappings

Hier sind alle möglichen Signaturen für equal:

function equal(string a, string b, string message) public returns (bool result)
function equal(bytes32 a, bytes32 b, string message) public returns (bool result)
function equal(address a, address b, string message) public returns (bool result)
function equal(bool a, bool b, string message) public returns (bool result)
function equal(uint a, uint b, string message) public returns (bool result)
function equal(int a, int b, string message) public returns (bool result)
function equal(uint[] arrA, uint[] arrB, string message) public returns (bool result)
function equal(int[] arrA, int[] arrB, string message) public returns (bool result)
function equal(address[] arrA, address[] arrB, string message) public returns (bool result)
function equal(bytes32[] arrA, bytes32[] arrB, string message) public returns (bool result)

Ausdruck muss ein Typ, ein Mapping oder ein Array sein (ist ein Tupel (Stringspeicher,Stringspeicher)) Assert.equal(salaries.employees(addr)[0], "Alicia Drake");