如何针对具有多个合同的本地网络运行 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.createAndDeployContracttest_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 测试的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何计算年份之间按月产生的收入?

如何针对多个请求顺序运行jmeter采样器

如何使用 xampp 在本地运行多个 laravel 应用程序并使它们可供我本地网络上的其他 PC 访问

针对具有不同构建参数的多个项目运行构建

sqlserver 镜像配置问题 (针对服务器网络地址 "TCP://XXXXX:5022" 无法访问或不存在。 请检查网络地址名称,并检查本地和远程端点的端口是否正常运行)(代码

sqlserver 镜像配置问题 (针对服务器网络地址 "TCP://XXXXX:5022" 无法访问或不存在。 请检查网络地址名称,并检查本地和远程端点的端口是否正常运行)(代码