Я просмотрел аналогичный ответ, но он не сработал. Прямо сейчас я начинаю с примера, пробуя трюфель, я сделал небольшой проект Echo, основанный на ящике для зоомагазина от Truffle. И у меня есть некоторые проблемы:
Мой договор такой:
pragma solidity ^0.4.24;
import "./strings.sol";
contract Echo{
address public owner;
string[] private history;
using strings for *;
string public s;
string public lastMessage;
uint public messageCount;
modifier onlyOwner() {
if (msg.sender == owner) _;
}
constructor() public {
owner = msg.sender;
lastMessage = "None yet";
}
function echo(string text) public returns (string) {
history.push(text);
lastMessage = text;
messageCount++;
return text;
}
function fullHistory() public view returns (string){
string memory _history = "";
for (uint i = 0; i < history.length; i++){
_history = _history.toSlice().concat("||".toSlice()).toSlice().concat(history[i].toSlice());
}
return _history;
}
}
Так что мои тесты на солидность работают отлично, я получил новые значения при проверке истории команд:
contract TestEcho {
Echo echo = Echo(DeployedAddresses.Echo());
function testWeReceiveWhatWeSend() public {
string memory testText = "HELLO";
string memory returnedText = echo.echo(testText);
Assert.equal(returnedText, testText, "Should receive the same");
// Assert.notEqual(word_count, 0, "Should have receive more than one");
}
function testWeReceiveTheHistory() public {
string memory testText = "HELLO";
echo.echo(testText);
string memory fullHistory = echo.fullHistory();
Assert.equal(fullHistory, "||HELLO||HELLO", "Should receive something");
}
function testWeReceiveTheLastMessage() public {
string memory testText = "THE SECOND";
echo.echo(testText);
string memory message = echo.lastMessage();
Assert.equal(message, testText, "Should receive the last message");
}
function testWeReceiveTheMessageCount() public {
uint msgCount = echo.messageCount();
Assert.notEqual(msgCount, 0, "Should be more than 0");
}
}
Но в javascript им не удается изменить состояние контракта, history
массив никогда не изменится. То же самое происходит со мной в сети. Может быть, я точно упускаю что-то очевидное, но я с этим несколько дней не нашел решения:
contract('Echo', async (accounts) => {
const from = accounts[0];
it("should return the same that i sent", async () => {
const instance = await Echo.deployed();
const textMessage = "TEST";
const text = await instance.echo.call(textMessage, {from});
assert.equal(text, textMessage, "echoes");
});
it("should return full history", async () => {
const instance = await Echo.deployed();
await instance.echo.call(web3.fromAscii("TEST"), {from});
await instance.echo.call("TEST", {from});
await instance.echo.call("TEST", {from});
const history = await instance.fullHistory.call();
console.log("FULL_HISTORY", history);
});
}
И по какой-то причине, которую я не знаю, Metamask перестал спрашивать меня о расходе газа, когда я использую функцию эха в браузере, я уже проверяю порт, и сеть правильная, на счету есть средства, единственное, что изменилось было то, что я случайно удалил METAMASK и установил новую версию. Тем не менее это не объясняет, почему тесты не работают.
буду признателен за возможную помощь
Решено!!!, извините за все проблемы...
ОБЪЯСНЕНИЕ:
Когда вы используете web3.js, форма:
ContractInstance.method.call()
Это просто для методов, которые аннотированы как представление или доступны только для чтения, вы все равно можете использовать что-то еще, но это не изменит состояние контракта. Вместо этого вы хотите использовать:
ContractInstance.method()
Просто маленькая деталь. РЖУ НЕ МОГУ
хорошая вибрация
await Echo.deployed()
наawait artifacts.require("Echo.sol").new()
. Кроме того, это не обязательно, но вы можете поместить его внутриbefore
предложения, а не внутри каждого изit
предложений (в зависимости от того, как вы хотите, чтобы ваш тест вел себя).алакрет