Cómo depurar mapeos de estructuras en pruebas de trufas

Este es mi archivo de prueba:

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

Y las definiciones en Salaries.sol:

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

¿Cómo puedo escribir pruebas para verificar el nombre y el rol del empleado? Actualmente, recibo el siguiente error:

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

Del mismo modo, ¿hay alguna forma de registrar las variables en la consola mientras se ejecutan las pruebas?

usando truffle 4.1.14_

Una solución cuando se usa solidity es emitir eventos como mensajes, por ejemplo, event consolelog (prueba de cadena) o event consolelog (nombre de cadena), pero este enfoque es algo inflexible, creo que las pruebas de JavaScript son más flexibles en el registro.

Respuestas (2)

Para depurar trufflepruebas es mucho más conveniente escribir pruebas enjavascript

En su caso, necesita usar []en lugar de()

salaries.employees[addr].name

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

Aquí están todas las firmas posibles para 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)

expresión tiene que ser un tipo, mapeo o matriz (es tupla(memoria de cadenas,memoria de cadenas)) Assert.equal(salaries.employees(addr)[0], "Alicia Drake");