Hier mein Vertrag:
pragma solidity ^0.4.4;
import "./SafeMath.sol";
contract TestContract is SafeMath {
struct Result {
bytes32 name;
uint256 balance;
mapping (address => uint256) betBalances;
}
function TestContract(bytes32[] _resultNames) {
for (uint i = 0; i < _resultNames.length; i++) {
results.push(Result({
name: _resultNames[i],
balance: 0
}));
}
}
function getBetBalance(uint resultIndex) public validResultIndex(resultIndex) constant returns (uint256) {
return results[resultIndex].betBalances[msg.sender];
}
function bet(uint resultIndex) public hasNotEnded payable {
Result storage result = results[resultIndex];
result.balance = safeAdd(result.balance, msg.value);
result.betBalances[msg.sender] = safeAdd(result.betBalances[msg.sender], msg.value);
}
}
Hier ist mein Testcode:
const web3 = global.web3;
const TestContract = artifacts.require("./TestContract.sol");
contract('TestContract', function(accounts) {
const params = {
_owner: accounts[0],
_name: "test",
_resultNames: ["first", "second", "third"],
_bettingEndBlock: 1000
};
let testContract;
it("allows users to bet if the betting end block has not been reached", async function() {
testContract = await TestContract.new(...Object.values(params));
testContract.BetAccepted().watch((error, response) => {
if (error) {
console.log("Event Error: " + error);
} else {
console.log("Event Triggered: " + JSON.stringify(response.event));
console.log("resultIndex: " + JSON.stringify(response.args._resultIndex));
console.log("betAmount: " + JSON.stringify(response.args._betAmount));
console.log("betBalance: " + JSON.stringify(response.args._betBalance));
}
});
let initialBalance = web3.eth.getBalance(testContract.address).toNumber();
let betAmount = web3.toWei(1, 'ether');
let betResultIndex = 0;
await testContract.bet(betResultIndex, { from: accounts[1], value: betAmount });
let newBalance = web3.eth.getBalance(testContract.address).toNumber();
let difference = newBalance - initialBalance;
assert.equal(difference, betAmount, "New result balance does not match added bet.");
let resultBalance = await testContract.getResultBalance(betResultIndex);
assert.equal(resultBalance, betAmount, "Result balance does not match.");
let betBalance = await testContract.getBetBalance(betResultIndex);
assert.equal(betBalance.toString(), betAmount, "Bet balance does not match.");
});
Und hier der Konsolenfehler:
/Users/xxx/.config/yarn/global/node_modules/truffle/build/cli.bundled.js:213982
throw reason;
^
AssertionError: Bet balance does not match.: expected '0' to equal '1000000000000000000'
at /Users/xxx/coding/xxx/test/topic.js:75:11
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
Ich habe bestätigt, dass die Wettmethode funktioniert, indem ich ein hinzugefügt Event
habe und dass das betBalance
so ist, wie es sein sollte (nicht in diesem Code enthalten). Aber es wird als 0 auf der Testseite zurückgegeben. Warum passiert das?
Ich weiß, dass Transaktionen keine Werte zurückgeben können, aber wird mein Aufruf zum Abrufen von resultBalance als Transaktion betrachtet, da ich den Aufruf verkette?
Ihr msg.sender ist nicht derselbe. Beim ersten Aufruf verwenden Sie { from: accounts[1] .. Beim zweiten nicht. Wenn Sie das verwendete Konto nicht angeben, handelt es sich um Konten[0]
Dekoration
Der Nomade
MitternachtBlitz
bet
Methode richtig funktioniert? Sie speichern das lokaleresult
Objekt nicht zurück in die Hauptzuordnung (results[resultIndex] = result
), also wird es möglicherweise nicht richtig gespeichert?Der Nomade
Event
, die ich verwende, um den Wert von zurückzugeben,results[resultIndex].betBalances[msg.sender]
und sie zeigt richtig den korrekten Kontostand an.