基于流程:JS测试-2。设置模拟器和部署合同
#javascript #测试 #区块链 #flow

介绍

Last Time我们介绍了如何开始在项目中的测试。该文章涵盖了JS测试框架中使用initmake命令的使用以及如何使用它们来踩踏您的测试环境。

我们将假设您已经完成了该过程并已准备好设置。

这次,我们将介绍如何部署新开发的合同到模拟器,以便能够对其进行脚本和交易。

先决条件

您将需要安装Flow CLI,以便能够旋转Flow Emulator。关注instructions在开发人员门户上的操作系统。

如果您还没有准备好环境 - 请遵循previous article的说明。

设置Cadence文件夹

大多数方法将允许您直接从.cdc文件中使用Cadence代码。唯一的要求是在指定文件夹中使用特定的文件夹结构。

让我们在项目的根部创建cadence文件夹。然后在其中创建3个新文件夹:

  • contracts-将持有您要部署的所有合同
  • transactions-对于任何交易代码
  • scripts-脚本相同

请注意,文件夹应完全以相同的方式调用,否则它们无法正常工作。我们已经计划了这项任务,该任务允许您使用自定义名称,但尚未实现

为了使框架知道要使用哪个位置,您需要调用init方法:

import path from "path";
import { emulator, init } from "@onflow/flow-js-testing";

describe("interactions - sendTransaction", () => {
  // Instantiate emulator and path to Cadence files
  beforeEach(async () => {
    const basePath = path.resolve(__dirname, "../cadence");
    await init(basePath);
    return emulator.start();
  });

  // Stop emulator, so it could be restarted
  afterEach(async () => {
    return emulator.stop();
  });
});

设置模拟器

为了测试任何网络交互,我们需要运行模拟器的实例。 Frameworks使用emulator实例处理该过程,该实例揭示了两种方法-startstop。这些将在停止模拟器后使用必要标志和额外的步骤处理运行flow emulator进程。

您可以在上面参考代码,以查看我们如何在beforeEach/afterEach块中使用它。

如何部署合同?

框架具有两个方便的功能,这将帮助您部署合同:

  • deployContract-允许您将合同代码作为字符串传递(方便,当您只是在玩耍时)
  • deployContractByName-将允许您通过cadence文件夹中的文件来部署合同(您通过,在调用
  • 时通过。

它们的功能非常相似,但是deployContractByName为您提供了一种简单的方式,可以在cadence/contracts文件夹中部署合同。让我们在OUF内部创建一个文件HelloWorld.cdc,然后粘贴以下内容:

pub contract HelloWorld{
    pub let greetings: String

    init(){
        self.greetings = "Hello, from Cadence"
    }
}

我们的小合同只有单个字段,我们将来可以阅读。让我向您展示如何测试。

使用make命令创建新的测试西装:

npx @onflow/flow-js-testing make first

此命令将运行测试框架提供的make工具并创建一个first.js文件,该文件将为您提供基本设置。由于在流量上部署合同只是发送专门设计的交易,因此我们将使用shallPass方法来确保一切正常:

import path from "path";
import { init, emulator, shallPass, deployContractByName } from "@onflow/flow-js-testing";

// Increase timeout if your tests failing due to timeout
jest.setTimeout(10000);

describe("deploy", () => {
  beforeEach(async () => {
    const basePath = path.resolve(__dirname, "../cadence");
    const logging = false;

    await init(basePath);
    return emulator.start({ logging });
  });

  // Stop emulator, so it could be restarted
  afterEach(async () => {
    return emulator.stop();
  });

  // We will put next block here
  // ========>
});

我们的第一个测试将非常简单。我们将用shallPass包装deployContractByName,并等待该计算的结果:

test("deploy Hello", async () => {
  await shallPass(deployContractByName({ name: "Hello" }));
});

做得好! ð但是这样的场景从来都不是这种情况。合同通常要复杂得多,并接受了以启动其领域的多种论点。让我们在我们的contracts文件夹中创建另一个合同Message.cdc,并使用以下Cadence代码填充它:

pub contract Message{
    pub let message: String

    init(message: String){
        self.message = message
    }
}

现在我们需要在部署合同时通过参数。我们可以通过在我们传递到deployContractByName的对象上指定args字段来做到这一点。它应该是我们在合同的init方法上定义它们的相同顺序的一系列值。

test("deploy Message", async () => {
  const message = "Cadence is great!";

  await shallPass(
    deployContractByName({
      name: "Message",
      args: [message],
    })
  );
});

请注意,框架将为您处理所有类型转换! ð

您可以尝试添加另一个参数,以确保测试失败,确保您正在执行
一切都正确。

我们可以使用的另一个功能是deployContract。它具有几乎相同的API,除了它期望您的节奏而不是文件名称code值。让我们对
进行简单的测试 说明如何使用它。

test("deploy Custom", async () => {
  await shallPass(
    deployContract({
      code: `
          pub contract Custom{
            pub let message: String

            init(){
              self.message = "This is custom contract! Neat, ha? :)"
            }
          }
        `,
    })
  );
});

您可以通过指定args字段与上面为deployContractByName所做的同样的方式传递参数。

最初的目的是处理和消耗
的参数 deployContractByName,没有出口。经过一番考虑,我们将其导出到启用
刚刚学习节奏进行实验的人

您可以在[Flow Developer Portal -Contract Management(https://developers.flow.com/tooling/flow-js-testing/contracts

上找到两个功能的详细说明

太慢了!

有时您试图测试的方案比默认的开玩笑超时需要更多的时间-5秒。您可以通过将超时增加到下一个合理的值来控制这一点:

// Place this after import lines
import path from "path";
import { deployContractByName, emulator, executeScript, init } from "@onflow/flow-js-testing";

jest.setTimeout(20000);

// the rest of the test setup below 👇

某些CI环境可能比本地机器慢,因此,如果您看到随机失败的测试 - 尝试增加此值。

仅此而已! Next time我们将看看如何执行脚本,签名和发送
交易。