TypeError: Cannot read property 'call' of undefined when testing solidity contract
TypeError: Cannot read property 'call' of undefined when testing solidity contract
我有这样的问题。我正在按照视频教程使用以太坊构建 dapp。
这是我的智能合约。
pragma solidity ^0.4.0;
contract SimpleWallet {
address owner;
mapping(address => bool) isAllowedToSendsFundsMapping;
event deposit(address _sender, uint amount);
event withdraw(address _sender, uint amount, address _benificiary);
function SimpleWallet()public{
owner= msg.sender;
}
function (){
if(msg.sender == owner || isAllowedToSendsFundsMapping[msg.sender]== true){
deposit(msg.sender, msg.value);
}else{
throw;
}
}
function sendFunds(uint amount, address receiver) returns (uint){
if(msg.sender == owner || isAllowedToSendsFundsMapping[msg.sender]){
if(this.balance>= amount){
if(!receiver.send(amount)){
throw;
}
withdraw(msg.sender, amount, receiver);
return this.balance;
}
}
}
function allowAddressToSendMoney(address _address){
if(msg.sender == owner){
isAllowedToSendsFundsMapping[_address]=true;
}
}
function disallowAddressToSendMoney(address _address){
if(msg.sender == owner){
isAllowedToSendsFundsMapping[_address]=false;
}
}
function isAllowedToSend(address _address) constant returns (bool){
return isAllowedToSendsFundsMapping[_address]|| msg.sender == owner;
}
function killWallet(){
if(msg.sender == owner){
selfdestruct(owner);
}
}
}
这里我提供测试文件
var SimpleWallet = artifacts.require('./SimpleWallet.sol')
contract('SimpleWallet', function (accounts) {
it('the owner is allowed to send funds', function () {
var myContract = SimpleWallet.deployed()
return myContract.isAllowedToSend.call(accounts[0]).then(function (isAllowed) {
assert.equals(isAllowed, true, 'the owner should have been allowed to send funds')
})
})
})
但是当我在控制台中点击 truffle test 时,它给了我这样的错误。
TypeError: Cannot read property 'call' of undefined
我用视频重新检查了代码,但两个代码很相似。它在视频中工作正常,但在我的电脑中,它工作不正常。我 google 它但我无法找到适合我的问题的答案。有人可以帮我解决这个问题吗?谢谢。
已修复并简化了您的测试文件,开始吧:
const SIMPLE_WALLET = artifacts.require('SimpleWallet.sol');
contract('SimpleWallet', function (accounts) {
let simpleWallet;
beforeEach('setup contract for each test case', async () => {
simpleWallet = await SIMPLE_WALLET.new({from: accounts[0]})
})
it('should let owner to send funds', async () => {
const isAllowed = await simpleWallet.isAllowedToSend(accounts[0]);
assert(isAllowed);
})
})
我有这样的问题。我正在按照视频教程使用以太坊构建 dapp。
这是我的智能合约。
pragma solidity ^0.4.0;
contract SimpleWallet {
address owner;
mapping(address => bool) isAllowedToSendsFundsMapping;
event deposit(address _sender, uint amount);
event withdraw(address _sender, uint amount, address _benificiary);
function SimpleWallet()public{
owner= msg.sender;
}
function (){
if(msg.sender == owner || isAllowedToSendsFundsMapping[msg.sender]== true){
deposit(msg.sender, msg.value);
}else{
throw;
}
}
function sendFunds(uint amount, address receiver) returns (uint){
if(msg.sender == owner || isAllowedToSendsFundsMapping[msg.sender]){
if(this.balance>= amount){
if(!receiver.send(amount)){
throw;
}
withdraw(msg.sender, amount, receiver);
return this.balance;
}
}
}
function allowAddressToSendMoney(address _address){
if(msg.sender == owner){
isAllowedToSendsFundsMapping[_address]=true;
}
}
function disallowAddressToSendMoney(address _address){
if(msg.sender == owner){
isAllowedToSendsFundsMapping[_address]=false;
}
}
function isAllowedToSend(address _address) constant returns (bool){
return isAllowedToSendsFundsMapping[_address]|| msg.sender == owner;
}
function killWallet(){
if(msg.sender == owner){
selfdestruct(owner);
}
}
}
这里我提供测试文件
var SimpleWallet = artifacts.require('./SimpleWallet.sol')
contract('SimpleWallet', function (accounts) {
it('the owner is allowed to send funds', function () {
var myContract = SimpleWallet.deployed()
return myContract.isAllowedToSend.call(accounts[0]).then(function (isAllowed) {
assert.equals(isAllowed, true, 'the owner should have been allowed to send funds')
})
})
})
但是当我在控制台中点击 truffle test 时,它给了我这样的错误。
TypeError: Cannot read property 'call' of undefined
我用视频重新检查了代码,但两个代码很相似。它在视频中工作正常,但在我的电脑中,它工作不正常。我 google 它但我无法找到适合我的问题的答案。有人可以帮我解决这个问题吗?谢谢。
已修复并简化了您的测试文件,开始吧:
const SIMPLE_WALLET = artifacts.require('SimpleWallet.sol');
contract('SimpleWallet', function (accounts) {
let simpleWallet;
beforeEach('setup contract for each test case', async () => {
simpleWallet = await SIMPLE_WALLET.new({from: accounts[0]})
})
it('should let owner to send funds', async () => {
const isAllowed = await simpleWallet.isAllowedToSend(accounts[0]);
assert(isAllowed);
})
})