00:00
前面只是让大家先熟悉一下他这个到底怎么写,呃,那接下来这一部分呢,我们就要开始真正的编写一个测试我们合约的一个脚本了啊,那这个就是真正我们呃今天要给大家说的这个内容,好,那么首先我们还是来创建一个,创建一个,在我们登录下面大家可以看到我们有这个scripts对吧,那我们还是先创建一个这个脚本吧,就是我们的测试脚本跟我们前面的scripts还是不一样的。大家一开始是不是创建过一个叫做test的一个一个文件夹,对吧?好,我这里还是把这个也创建出来,所以大家可能想到这个test其实就是我们之后想要用到,呃,用作这个保存测试合约的一个一个目录,好那么我们这里先先把它放着啊,我们先在外面直接去写一个这样的文件吧,比方说我们这里要测这个之前的car合约,呃,我们直接car specification的JS,先创建一个这样的一个JS文件。
01:10
这就是我们想要创建的测试脚本,那同样进来之后我们还是先要把assert require进来,对吧?Ertert,然后大家应该能想到我们是不是应该需要那个WEB3啊。对吧,呃,我们最后再写WEB3吧,我们先把别的先放进来啊,呃,这里边我们如果要涉及到文件的读取的话,肯定需要这个pass这个这个东西啊,我们要拼一些它的路径,所以把pass先引进来,然后大家应该能想到我们这里要。跟大家说了,我们要直接用GA纳引入这个GA纳这个模块,所以我们直接GA纳,当然大家知道这个它的本身模块的输出定义叫GA纳C对吧,所以大家注意别敲错了就行,最后我们把WEB3引入B3,好,那大家熟悉的这个肯定接下来我们除了这个。
02:31
呃,引入这些模块之外,这个WEB3还得配一下provider对吧?我们之前熟悉的方式是WEB3等于new一个WEB3,然后后边呃,New web3providers对吧?大家大家熟悉的是这种方法,那现在呢,我们既然已经有了GA galax这个模块了,我们就不需要用这种方法,我们直接new web3galax.provider给就是下边有直接这个provider方法,我们直接用这个把它提供进去就可以了,对,大家可以看到这个就简单多了,我们不用手动点进去把provider提起,把那个GALA提起来,然后在里边指定说localho的8545对吧?直接引入的话,这个其实就完全内嵌在我们程序里边,不用去外部再单独起一个环境了,而且也不会占用我们的8545端口,但是如果想做别的一些测试或者部署的话,就是还可以直接在外面。
03:31
再去重新起一个盖,或者说GA纳去起一个8545都可以,所以这里我们就专门为测试建的这么一个拈块,好,那接下来大家就会想到,那我们就是还还有合约对吧,Contract contract啊。呃,我们在创建合约之前先定义一些,我看是不是应该是要定义一些变量啊,哦,对,我们先要拿到这个API和code对吧,另外就是为了方便我们拿到这个就是我们的这个内容的话,拿到那个卡点Jason读取的话,我们还要定义这个contract pass,好,Contract pass等于。
04:18
呃,pass.result这个之前大家写脚本的时候都都用到过,对吧?首先前面是DR内,然后后边,呃,它的应该是在当前,我们现在放的地方应该是当前目录对吧?当前目录下面的还下面有一个叫做card.jason的文件,好,呃,紧接着我们在定义。Interface和。
05:02
啊,这个写错了,应该是划括号对吧,这是一个对象。好,His bad code,我们会从require在我们前面定义好的这个contract pass里边,这个car Jason里面把interface,和back code2个内容拿出来,这就是我们的abi和自减码,对吧?好,接下来我们那就会去定义一些。我们应该就可以去写合约了,对吧?好,接下来还需要再定义一些基本的一些变量啊,这里面变量的话,大家就可以直接用let了,比方说我们定义一个合约变量contract,定义一个呃,我们的账户这个变量叫account,那另外就是我们可能还有初始值对吧?看一个初始值initial initial叫brand,对吧。
06:14
定义一个初始的品牌,比方说宝马,下面我们就可以真正的去写我们的测试用例,首先describe,那假如说我们这个就直接就叫contract,好,那么接下来定义一个回调,把我们的测试用例写在里边,那这个回调里边呢,大家可能就会发现我们是不是每次再去做测试的时候。就是我们每要测一个模块的时候,是不是还是应该保证它是一个非常干净,非常就是初始状态的一个一个测试环境呢?所以说如果大家考虑到这个的话,那我们就定义一个before each。也就是说每次。
07:10
进行测试,每一个单元测试模块在调用之前,我们都要执行一个动作,执行一个什么动作呢?就是初始化我们合约的动作,也就是把我们的合约直接部署到我们内置的区块链里面去测试区块链上,呃,然后把我们的初值BMW付进去,每一次我们启动就是要测一个单元的时候,都重新去部署一个这样的合约,因为这个测试环境嘛,也没有什么成本,所以说我们完全可以这么去做,对吧?好,我们先定义这样一个before each啊,那这个时候大家就会发现,呃,我们就会有这样的一个写法了,这是在做什么呢?在做异步的测试。对,大家看到啊,他测这个异步方法的时候非常的简单,也就是直接定义一个函数就可以,大家应该之前印象我们直接测普通函数的时候,也是后边就是一个回调形式的一个一个匿名函数,对吧?一个啊,我这里少了一个箭头啊,也是一个回调形式的匿名函数,直接传进去就可以测了,后面就是它执行的内容,那同样我们要测一个异步方法的时候,异步函数的时候,只要加上就ES7里边这个关键词a think非常简单,就Mo是支持这个这种方式,那我们就可以去测这个异步的函数,好,那么a think里边我们肯定就要初始化,初始化那首先我们拿到count。
08:42
Account等于,呃,这就要拿我们WEB3里边的Eth.get account对吧?那大家要注意,这是一个异步方法,所以我们在前面要加上wait,对吧,I think wait,这就是呃,整个表示这是一个异步的调用,异步的执行,而每一个异步调用呢,我们在执行的时候又希望它有顺序,所以说有一个OA的关键字。
09:15
所以说是要等待这个异步调用完成之后,我们才会继续往下去执行啊,那整体呢,它是一个think的方法啊,好,有了这个accounts之后,那我们肯定下面就可以去部署这个contract了,对吧?那contract等于,呃,大家应该还记得啊,我们在这个1.0.0里边,它的写法跟0.21.0不一样,直接newweb3.eth,这个是大写的contract对吧?大写的contract,然后里边想要传入的东西呢,就是我们的API了。所以呃,但是我们这个单记得这个API它是一个字符串,所以说我们把它jason.pass一下interface,好啊,那大家肯定还记得,就是我们当时在部署的时候,它,呃,这个传进去的这一步,有点类似于我们一开始创建抽象合约的那一步,对吧,就是web3.1H点,呃,Contract,然后后面跟API创建一个抽象合约,然后之后呢,我们还要把这个抽象合约把它部署,就是对应到我们真正的一个地址上去,部署的时候我们还要去发起一个交易,然后才能创建出我们真正的合约实力,对吧?所以在1.0.0里边,它当时我们的写法就是后面是deploy,大家还记得吧,就两天前我们我们这么写过啊,呃,Deeplo呢,大家就会想到你既然deeplo,那我们就得要自己码了,对吧?呃,这是一个对象啊。
10:54
应该是data code,然后它还有一个参数叫做argue argue怎么写,Argue应该没写错吧?啊,关键词啊,Arguments,这是我们想要输入的参数对吧?Constructor里面调用的参数,所以我们的参数是前面定义好的initial brand,也就是宝马这个字符串啊,好,那么同样链式调用,对,大家记得后面还有一个散的方法,就是直接可以把我们这个交易发出去,那那这个就是要跟交易相关的一些东西了,对吧?From to value,那我们这个既然是一个部署合约的交易,那to是零地址,我们不用写,只要有一个from就可以了。
11:48
From,好。呃,那不需要有to,也不需要有value,我们不需要给他转以态,那我们可以定一个gas对吧,就相当于是GA limit,我们定义一个300万吧,应该够啊,好,这就相当于是我们定义了一个。
12:10
我们的合约实例,它有了这一这这个完整的步骤之后,大家就会发现,首先我们在JJS里边创建了这个web web3的这个抽象实力,然后呢,定义了deploy,这个就有点像我们当时去,呃指定我们的那个要散的对象里面的data对吧,然后还有那个,他只不过把这两个抽出来了,抽出来一个叫做deploy的一个对象,另外是send的一个交易的对象。所以大家能够想到,其实这个deploy这里的对象bad code和arguments是要合起来,当成我们的,当成我们的data的,对吧,交易的data的,所以它是要有一个合并的过程,那最后是send把它直接发送出去。呃,那这样我们就完成了这个合约的这样的一个部署,那大家可以想象到,呃,既然我们是before each,那就是每一次这里我们给了这个before each的这个方法,调用这个方法,也就是说下面我们每个测试实力在跑之前都得跑一遍,这个都得先把它部署出来,好,那么接下来啊,哪个。
13:33
哪个错了,Initial?哦,隐你手拼错了是吧?哦,大家看的很细啊,非常好。我这边也拼错了是吧?那边少一个爱,这边少一个爱。结果还错的不一样,好呃,接下来我们就写这个合约实例了,呃,就就是就是写我们的测试的这个脚本的真正的单元测试的内容了,It前面我们先给一个它it应该是什么东西,对吧?诶可以习惯用这个单引号也可以啊,首先我们应该要测一下我们这个实,就是前面部署的这个过程,到底部署成功没有,对吧?看这个contract到底有东西没有,那我们大家知道他要是有部署成功的话,我们应该能拿到它的它的地址对吧?好,所以我们应该是比方说it应该是deployed contract,就是已经已经部署完了deployed contract successfully吧,写的明确一点啊,好,那么接下来。
14:50
我们对它的实现其实很简单,我们用一个断言assert,然后直接aser,或者大家可以用这个aer.ok啊呃,我们课件里面应该是aer.okas4.ok就相当于是assert,它就直接判断后面这个表达式是否为真,如果是true的话,那就返回,就是asert成功,如果是false的话就报异常,那当然这个这个异常会被这个。
15:24
Mo的框架抓到,然后去给我们处理掉,对吧?来肯定知道这个好assert,呃呃,这个我们不应该是一个一个内容啊,我们应该assert这个contract点,大家还记得那个address是什么吗?Options里边的对吧?options.address好。这就是我们基本的一个测试,好,外面有点吵啊,我们把这写完吧,好,后面还有两个内容,那那我们就先跑一下这个好了,好,现在我们已经写了一个简单的测试了,这就是测试我们这个合约到底部署成功没有,我们先来跑一下试试吧,好,那么大家可能知道我们前面已经知道了这个mota怎么运行,对吧,Mota点,但是大家如果觉得这个这种方式不太方便的话,每一次都得敲这么一串,大家也可以把它加到我们环境变量pass里边,那每一次就直接敲就可以了,对吧?好。
16:29
Mota,我们这里应该有一个卡点,好看一下。诶,大家看它,它为什么这么慢呢?它部署合约对吧?好,我们看到它这里边。失败了,大家可以看到前边的这个第一个它显示的deploy contract successfully,但是后面这一句失败了,所以我们可以看到。
17:02
Address这个东西没有,所以我们在写的时候可能有一点错误,对吧。或者是我们就根本没有。呃,大家知道我们错在哪吗?大家可以先看一下我们这个整个这个写的这个脚本哪里错了,该能知道哪里错了吗。啊,那那大家先自己实现一下,然后大家可以先测一下,我可以提示一下大家啊,就是我们刚刚accounts这里是定义了的,对吧。那下边前面这个定义额位,因为后面get和POS这是一个异步请求,那下边我们发送交易,它是同步还是异步呢。
18:01
如果是异步的话,我们也应该wait,是不是如果不定义的话,他就直接执行完了对吧?他就直接执行完了就会调用下面的方法,不等我们这里返回,他就直接调用下面的方法了,所以有可能我们就会发现下面好像拿不到地址,因为他还没部署完呢。是不是这样,所以好,我们这里改一下,来看一下是不是能成功啊wait,我们加一个这样的关键字,好那么我们现在再来去跑一下猫。诶,大家可以看到现在就测试成功pass。所以大家要稍微注意一下,我们这里这个同步异步的这个问题,就是如果要是JS里边的异步请求的话,它本身都是非阻塞的,所以就是说发出去请求之后就不管了,所有的处理都在他自己的回调,那本身我们写好的下面的代码该执行什么,继续执行,那这个时候其实我们是拿不到它执行的结果的,对吧?前面他发生的这些事情是拿不到执行结果的,如果这个时候我们就直接去assert的话,那就会发现,诶,这个地址不存在on。
19:20
那如果说我们想要让它有一个执行顺序的话,或者我们就是在这个函数我们它的回调里面,或者是在他promise里边去写所有的这个it怎么样怎么样,对吧,去再做断言,但是我们肯定不想那么写,那样的话,我们整个这个,呃,我们的脚本的整个的这个文件架构就很乱了,就有这个回回调地域的情况出现了,因为后面我们现在只有一个断言,后面可能我们还会有很多测试的实例,所以我们就用了ET里面非常使的这个可以说是神器啊,就是a think of it啊,大家使熟了之后,一开始大家接触可能会觉得有点不好理解,使熟了之后就会发现它非常好用,那只要我们定义了think这个关键字,就说明整体这是一个异步请求。
20:10
那然后在里边有了away关键字的话,那所有的这些内容它都是同步执行,相当于大家可以认为它是顺序的同步执行的,执行完一个再执行下一个,所以这个就我们的整个的业务流程就很容易的都可以放在里边了。
我来说两句