Truffle测试中的合约实例获取方式:deployed() vs new()

308 阅读2分钟

当使用Truffle进行智能合约开发时,通常会编写测试用例来验证合约的功能和逻辑。在代码中,你可以分别使用deployed()new()来获取合约实例。下面将分别对这两个测试合约进行讲解。

使用 deployed()

首先,让我们看一下第一个测试合约:

const Test = artifacts.require("Test");

contract("Test", function (/* accounts */) {
  let TestInstance;
  beforeEach(async () => {
    TestInstance = await Test.deployed();
  });
});

在这个测试合约中,我们使用artifacts.require()来加载名为"Test"的合约。接下来,我们定义了一个contract块,这个块中的代码会在测试套件中运行。在beforeEach钩子函数中,使用await Test.deployed()获取已部署的合约实例,并将其赋值给TestInstance变量。

使用Test.deployed()时,Truffle假设已经有一个名为"Test"的合约已经部署,并返回该合约的实例。因此,这个测试合约适用于已经部署的合约的测试场景。

使用 new()

接下来,让我们看一下第二个测试合约:

const Test = artifacts.require("Test");

contract("Test", function (/* accounts */) {
  let TestInstance;
  beforeEach(async () => {
    TestInstance = await Test.new();
  });
});

在这个测试合约中,同样使用artifacts.require()加载名为"Test"的合约。然后,定义了一个contract块,并在beforeEach钩子函数中使用await Test.new()来部署一个新的合约实例,并将其赋值给TestInstance变量。

使用Test.new()会部署一个新的合约实例,并返回一个Promise对象,该对象在合约部署完成后被解析。因此,这个测试合约适用于需要在每个测试之前部署一个新的合约实例的场景。

通过上述两个测试合约的讲解,我们可以根据需求选择合适的方法来获取合约实例。使用Test.deployed()适用于已经部署的合约实例的测试,而使用Test.new()适用于每个测试都需要部署新的合约实例的场景。