Так что я не знаю, правильно ли я сформулировал заголовок, но у меня проблемы с переменными в моих сценариях Javascript Test.Когда я пытаюсь отправить переменную в моем тестовом скрипте в контракт на надежность, она не получает ту же переменную в отправленных событиях.
Вот мой сценарий тестирования JS
const NFCertificate = artifacts.require("../contracts/NFCertificate.sol");
contract("NFCertificate", accounts => {
let account1 = 0x49f0C9b4Ab0b0DedDABf8b62e6089C9b20f936fa;
let certNum = 23477264530040661;
it("It should make first account an owner", async () => {
let instance = await NFCertificate.deployed();
let owner = await instance.owner();
assert.equal(owner, account1);
});
it("It should send a token and save it", async () => {
let instance = await NFCertificate.deployed();
await instance.createCertificate("hello", "world", "www", account1, {from: "0x49f0C9b4Ab0b0DedDABf8b62e6089C9b20f936fa"});
await instance.checkTokenStatus(certNum);
//await instance.checkOwnerStatus(account1, certNum);
//await instance.destroyCertificate(certNum, {from: "0x49f0C9b4Ab0b0DedDABf8b62e6089C9b20f936fa"});
assert.deepEqual(0, 1, "...");
});
});
Обратите внимание на значения, указанные в переменных "account1" и "certNum".Ниже приведено событие из контракта, когда я запускаю тестовый скрипт.
returnID(ID: 16514060434978983)
returnID(ID: 23477264530040661)
returnID(ID: 123477264530040661)
Transfer(from: <indexed>, to: <indexed>, tokenId: <indexed>)
ReturnNewCertificate(index: 0, CID: 23477264530040661, msgsender: 0x49f0c9b4ab0b0deddabf8b62e6089c9b20f936fa, onwershipHistory: 0x49f0c9b4ab0b0b7d8d98c5f33841ce0d00000000)
ReturnStatus(status: false, CID: 23477264530040660)
Обратите внимание, что последние два события имеют некоторые расхождения в переменных.
Сначала в контракте создается номер CID в событии «ReturnNewCertificate» на основе алгоритма sha256.Я жестко закодировал это же число в качестве значения для переменной «certNum» в JS-скрипте и отправил его через функцию «checkTokenStatus», которая проверяет, существует ли этот идентификатор.Однако из события «ReturnStatus» мы можем видеть, что идентификатор, отправленный из тестового сценария, имеет неверную последнюю цифру, от «1» до «0» (сравните CID в обоих событиях).
Это то же самоепроблема возникает при отправке переменной "account1" через функцию "createCertificate", проверьте переменную "ownerHistory" в событии "ReturnNewCertificate" и сравните ее с переменной account1 в тестовом скрипте.
Ниже приведены функции солидности, которые я выполняю в тестовом скрипте.
function createCertificate(string title, string data, string url, address owner) public returns (uint certificateID, uint licenseID, uint assetID) {
assetID = generateAssetID(data);
AssetIDS.push(assetID);
certificateID = generateCertificateID(assetID, owner);
Certificate memory certificate = Certificate(Certificates.length, certificateID, assetID, 0, url, title, owner, owner, new address[](0), true);
uint index = Certificates.push(certificate)-1;
CIDtoIndex[certificateID] = index;
Certificates[index].ownershipHistory.push(owner);
//License
licenseID = createLicense(certificate.index, certificateID, owner, owner);
//ERC721 Mint
NFCProtocols.mint(owner, certificateID);
emit ReturnNewCertificate(certificate.index, certificate.certificateID, msg.sender, Certificates[certificate.index].ownershipHistory);
}
function checkTokenStatus(uint certificateID) public {
bool status = NFCProtocols.exists(certificateID);
emit ReturnStatus(status, certificateID);
}
Наконец, извините. Если это немного запутанно, я немного новичок в кодировании в целом, поэтому мой код может быть не самым красивым.Также я почесал голову, пытаясь выяснить проблему в течение нескольких часов, поэтому любая помощь будет принята с благодарностью.