介绍
Last Time我们介绍了如何开始在项目中的测试。该文章涵盖了JS测试框架中使用init
和make
命令的使用以及如何使用它们来踩踏您的测试环境。
我们将假设您已经完成了该过程并已准备好设置。
这次,我们将介绍如何部署新开发的合同到模拟器,以便能够对其进行脚本和交易。
先决条件
您将需要安装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
实例处理该过程,该实例揭示了两种方法-start
和stop
。这些将在停止模拟器后使用必要标志和额外的步骤处理运行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我们将看看如何执行脚本,签名和发送
交易。