如何针对具有多个合同的本地网络运行 Near-js-api 测试
Posted
技术标签:
【中文标题】如何针对具有多个合同的本地网络运行 Near-js-api 测试【英文标题】:How to run near-js-api tests against a localnet with multiple contracts 【发布时间】:2021-01-14 11:39:33 【问题描述】:我已经设置了节点:
nearup run localnet --binary-path ~/code/nearcore/target/release
我正在尝试运行一个开玩笑的测试用例:
beforeAll(async function ()
// NOTE: nearlib and nearConfig are made available by near-cli/test_environment
const near = await nearlib.connect(nearConfig)
)
但是,显然缺少如何在本地节点上创建测试帐户的步骤。这是错误:
● Test suite failed to run
Can not sign transactions for account test.near, no matching key pair found in Signer.
at node_modules/near-api-js/lib/account.js:83:23
at Object.exponentialBackoff [as default] (node_modules/near-api-js/lib/utils/exponential-backoff.js:7:24)
at Account.signAndSendTransaction (node_modules/near-api-js/lib/account.js:80:24)
at Account.createAndDeployContract (node_modules/near-api-js/lib/account.js:176:9)
at LocalTestEnvironment.setup (node_modules/near-cli/test_environment.js:39:9)
看起来near-js-api
也被硬编码为只部署一个合约。我需要测试多个合同。如何部署多个合约?来自near-js-api test_environment.js
class LocalTestEnvironment extends NodeEnvironment
constructor(config)
super(config);
async setup()
this.global.nearlib = require('near-api-js');
this.global.nearAPI = require('near-api-js');
this.global.window = ;
let config = require('./get-config')();
this.global.testSettings = this.global.nearConfig = config;
const now = Date.now();
// create random number with at least 7 digits
const randomNumber = Math.floor(Math.random() * (9999999 - 1000000) + 1000000);
config = Object.assign(config,
contractName: 'test-account-' + now + '-' + randomNumber,
accountId: 'test-account-' + now + '-' + randomNumber
);
const keyStore = new nearAPI.keyStores.UnencryptedFileSystemKeyStore(PROJECT_KEY_DIR);
config.deps = Object.assign(config.deps || ,
storage: this.createFakeStorage(),
keyStore,
);
const near = await nearAPI.connect(config);
const masterAccount = await near.account(testAccountName);
const randomKey = await nearAPI.KeyPair.fromRandom('ed25519');
const data = [...fs.readFileSync('./out/main.wasm')];
await config.deps.keyStore.setKey(config.networkId, config.contractName, randomKey);
await masterAccount.createAndDeployContract(config.contractName, randomKey.getPublicKey(), data, INITIAL_BALANCE);
await super.setup();
near-js-sdk 本身正在针对神秘的共享测试进行部署
case 'ci':
return
networkId: 'shared-test',
nodeUrl: 'https://rpc.ci-testnet.near.org',
masterAccount: 'test.near',
;
【问题讨论】:
【参考方案1】:如何部署多个合约?
您可以使用masterAccount.createAndDeployContract
与test_environment.js
相同。除了一些常见的初始化之外,没有什么特别之处 - 您可以直接创建测试所需的任何帐户/合约。
near-js-sdk 本身正在针对神秘的共享测试进行部署
这是可用于运行集成测试的共享网络。除非您想将您的开发工作保密 - 建议您使用运行测试的方式(因为当前可用于测试的最真实的环境)。
但是,显然缺少如何在本地节点上创建测试帐户的步骤。
如果您使用create-near-app
创建项目,您可能已经在neardev/
项目文件夹中有相应的test.near
键。这就是为什么上述神秘环境通常开箱即用的原因。
对于您的本地环境,您需要自己创建test.near
:
NODE_ENV=local near create-account test.near --masterAccount some-existing-account
之后,您可以将密钥复制到本地格式(或者只需重新配置 UnencryptedFileSystemKeyStore
以使用 ~/.near-credentials
路径):
cp ~/.near-credentials/local/test.near.json project/dir/neardev/local/test.near.json
【讨论】:
以上是关于如何针对具有多个合同的本地网络运行 Near-js-api 测试的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 xampp 在本地运行多个 laravel 应用程序并使它们可供我本地网络上的其他 PC 访问
sqlserver 镜像配置问题 (针对服务器网络地址 "TCP://XXXXX:5022" 无法访问或不存在。 请检查网络地址名称,并检查本地和远程端点的端口是否正常运行)(代码
sqlserver 镜像配置问题 (针对服务器网络地址 "TCP://XXXXX:5022" 无法访问或不存在。 请检查网络地址名称,并检查本地和远程端点的端口是否正常运行)(代码