Ich verwende eine vereinfachte Version eines Vertrags, der von der Solidity-Website bereitgestellt wird. Mein Vertrag lautet wie folgt:
pragma solidity ^0.4.4;
import "./ConvertLib.sol";
contract MetaCoin {
address owner;
uint val;
function MetaCoin() {
owner= msg.sender;
}
modifier onlyOwner {
require (msg.sender==owner);
_;
}
function change() onlyOwner{
val=55;
}
function get_owner() returns (address){
return owner;
}
}
Und mein Testvertrag ist wie folgt:
pragma solidity ^0.4.2;
import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/MetaCoin.sol";
contract TestMetacoin {
function test1(){
MetaCoin meta = MetaCoin(DeployedAddresses.MetaCoin());
meta.change();
}
function test2(){
MetaCoin meta = MetaCoin(DeployedAddresses.MetaCoin());
Assert.equal(meta.get_owner(), msg.sender, "I must be the owner");
}
}
Ich verwende testrpc. Also stelle ich zuerst den 1. Vertrag bereit: „Trüffelbereitstellung“ und dann führe ich den Testvertrag aus: „Trüffeltest“.
Problem : Test2 wird bestanden, Test1 jedoch nicht. Wenn ich "onlyOwner" aus change() entferne, kann test1 bestehen.
Frage : Warum kann test1 nicht bestehen und was ist die Lösung?
Bitte beachten Sie, dass beide Verträge fehlerfrei erstellt werden.
Es schlägt fehl, weil der Anruf intern ist TestMetacoin.test1()
und wenn ein Vertrag A einen anderen Vertrag B anruft, dann ist msg.sender innerhalb von B die Adresse von A.
Sie können den Absender nicht innerhalb eines Soliditätsvertrags ändern, daher würde ich vorschlagen, diesen Test von der Javascript-Seite aus durchzuführen, wodurch der Absender leicht geändert werden kann, indem {from: "0x...." }
er der Transaktion hinzugefügt wird.
Ismael
MetaCoin
es keinetest
Methode hat, es sollte immer fehlschlagen. Meintest duchange
statttest
? Können Sie in einem solchen Fall die genaue Fehlermeldung von Trüffel eingeben?Ja.
Ismael
meta.test();
ist falsch, weil Metacoin keinetest()
Methode hat.