00:00
接下来我们去改一下这个JS吧,看看这个JS该怎么写好,那么这个JS其实就相对来讲简单一些,不要不要看它,好像这个代码量更大啊,这个我们都可以删掉的,呃,那同样大家会想到一开始我们是不是还是得定义一下我们的这个合约的对象,所以JS里边我们定义合约对象的时候,呃,再想到这个artifacts对吧,然后把这个voting.sol源文件引入,所以在这个里边我们只要把它的这个artifacts引进来,然后直接这里边。Contract voting就可以用了,对吧?所以大家注意这样的写法啊,这是travel里边特殊的这种写法,就是它里边有一个contract关键词,然后我们只要前面把这个voing对象引进来,后边我们就可以用JS里边的就是就是这就相当于大家看这里边我们给的这个so,相当于给到这个voting之后,相当于拿到了它的一个抽象的对象,对吧,合约对象。
01:09
那后边我们就可以用JS里边,WEB3里边大家看到。me.deployed就可以这么用了,对吧?所以大家可以看到下面就是it,这样就是Mo的这种格式啊,我们可以把这个都删掉,这个还看不太清楚这个到哪一步啊,这里少删了一个,好好这样的一个模式,所以接下来大家知道每一个it就应该是我们的一个测试模块,所以我们就可以直接写了,It怎么样,这其实就是我们想怎么写就怎么写,比方说我们呃,就是呃,我们先说it should be able To Buy,对吧?来看课件的话,应该一开始就是说可以买。可以买token,所以接下来我们去写一个函数,作为就是it的这个回调的形式,然后去写一个函数,这里边函数在写的时候,大家要就是得得注意一下它的这个写法啊,大家可以看到它的写法是什么呢?直接去return。
02:18
这个为什么这么写呢?因为在窗口里边,他给我们把每一次这个函数调用都包成了一个promise,所以这边我们如果直接return加上后边的这种调用方法的话,大家可以看到后边是不是我们前前面整个这一部分返回就是一个promise,所以后边就可以直接用promise点赞的这种链式调用了。所以这个对于我们来讲,是不是构建这种功能测试一步一步特别的方便,所以在这个JS的测试文件里边是用这种方式去写的,大家可以看一下这个风格啊,那当然我们这里就不要这个ma Co了,对吧。
03:03
我们voting,大家可以看到voting.deployed这就拿到我们的合约对象了,对吧,然后点赞拿到啊,它这里叫instance,那我们就instance吧,然后拿到这个instance之后,他直接用return instance去调用方法,那我们知道这里是不是我们就要去直接点BY啊。直接拜,然后拜的时候我们得传东西了,对吧。Value,呃,比方说这个我们是一个ETH的话,那我们要WEB3点。兔尾一对吧,这。然后这边的呃,From其实大家就可以不写了,因为在JS里边,它其实默认就是调我们那个S0的对吧,所以这里可以不写啊。
04:00
好,那接下来大家注意就是,呃,我们在这里是return了一个。我的括号有问题吗?少了一个花括号,这个很容易出错啊,好,那么我们现在return这样一个instance.by那么大家会想到他return完了之后呢,我们就可以点赞,然后做链式调用,就相当于我们在BY后面去点赞了,对吧?那种方式我们看着还是有点不太舒服,然后用这种return之后再去练式教程的方式,现在就会比较简单,就是大家可以一步一步的去往下做好,那么接下来大家知道这个拜这个返回的东西其实没什么用,对吧?那接下来我们其实是要继续拜完了之后怎么去做呢?我们要查询当前的余额是不是改了,对吧?所以接下来我们其实要做的应该是一个什么东西,还得继续return,对吧?按照他这个写法,我们还不到assert的时候。
05:05
好,继续return什么呢?我们要去查询了。点偷应该叫什么?又忘记我们那个合约里边定义的那个名称叫什么了,叫token balance,对吧,我们是不是应该是买完了之后要查一下他的这个token balance对不对,是应该有一个这样的一个检查,对吧。所以我们要把这个要查出来token balance,然后他要,呃,它应该没有参数对吧?好,所以我们直接去返回这个token就可以了,呃,那大大家可以想到我们这个时候直接返回这个token balance,呃,这个时候我们是不是还应该去存一下东存,把它存起来,然后去做判断,要不然我们根本不知道这个东西该怎么用,对吧?所以大家其实可以想到,我们最后其实是在某一个地方要去有一个assert的,而sert,那我们肯定是要判断两个值是否相等啊。
06:23
那我们应该去想到我们要判断哪两个值呢?呃,首先我们可能。在这里就应该去想到,我们先定义一个,呃,比方说我们可能去判断一下这个token balance是不是有,对吧,然后我们可能想到比方说我们还有这个token,诶,Token sold跟token balance好像是一回事,是吧,就它会剪一下,所以我们这两个可以可以只查一个,那我们只查这个头so的好。好,那么我们这里边的话就应该是token so。
07:02
看一下定义啊。Po so。我们这里的这个文件名还没有改,我们把它rela一下。Boating。呃,好,大家可以看到,就是我们在这里拿到这个token sold之后呢,我们就可以直接去把它拿出来,拿出来之后我们return了这个东西,是不是接下来又可以练式调用了,是不是这样的一个过程,好,所以在这里的话,我们又可以方式啊,当然当然这里可以,我这是又写成传统的这种写法,大家也可以直接用我们这个函数的方式,对吧,比方说就是箭头函数的方式,这里就是我们就叫amount吧,不要跟它定义成一样的。Amount,然后把它的返回在写在里边,那么我们拿到这样一个amount之后,我们会去做一个什么操作呢?那么大家可以想到我就可以assert了,对吧?那这里边我们呃,再用一个,这个就是保存我们这个变量的一个方式,我们到最后再去做ser,前面我们先做这个步骤,先把它存起来,存到我们前面定义的这个token so里面,好,那么我们把它存起来之后,那说明我们还想去查一些别的对吧,我这里边是卖的这么多,那我这个用户自己有没有真正的买到呢?我们是不是还应该。
08:41
呃,就是token。User。对吧,我是不还应该查一下这个东西,所以在这里我们再去return instance。点。呃,这个是什么?这个应该在那个water details里面了,对吧,应该记得吧,Detail还是details又忘记了。
09:10
Motor details。Vote details,然后大家可以有印象,就是这个东西我们如果拿出来之后还得拿它的第,呃,应该是第一个元素对吧,所以这个我们就直接return下面是不是又可以去电视调用,大家可以看啊。所以这里边我们就比方说拿到这个response。我们就直接可以把这个token user bought定义成response的第一个元素,这样我们就把它都到都存起来了,对不对?好,所以大家可以看到我们的这个做法就是到底是怎么样去一个一个拿到这些东西的,好那么到目前为止,我们的这个链式调用就结束了,那最后就是要做断演assert点,然后。
10:12
E,对吧,对,这个里边我们就要去做断联断言,那断言是断言什么呢?就是token sold。啊,那么它的值。大家知道这个可以用value of对吧,因为我们不知道它返回来的那个东西到底是什么,就是到底是什么样的一个数,所以我们把它选一个value,然后后边应该是我们这是买了多少啊。前面我们buy是买了一个ETH,那我们这里就不给expected了,直接给一个100好了,好,那这样就可以了,对吧,后面加一个假如说出错的话,Token so should be 100好,那同样大家可以想到我们一样的去把这个前面定义好的token user boat去定义一下,这个也应该是100对不对。
11:15
所以就是这样的一个过程啊,User boat这个里边大家看这样就写完了,但是这个过程当中,其实大家会发现,其实这里面是有一个问题的。大家能想到会有一个什么问题吗?大家看这个过程当中链式调用。会有一个什么问题?大家如果细心的话,会发现我们用的调用方式都是instance.token so instance.water details对吧?对instance我们在哪定义的?这个是我们第一次做voting.deploy的,之后拿到他的那个promise的返回作为参数给到第一个链式调用的点在里面的,对吧,这个东西我们并没有传递到下面对不对?那其实下面这个其实是异步的,呃,就是大家认为可以认为它就相当于回调一样的东西,那在这个回调里面其实是拿不到这个instance的,对不对。
12:22
所以大家要注意,我们这里如果要去用这个instance的话,那对就只好我们在外面去单独的定义一个instance,那我们这里拿到的假如说就叫一个。那么我们这里去把instance对定义成我们这里的,相当于在外部保存一个啊,对于他来讲就是更大范围的作用力的一个,大家可以理解成有点像全局变量了,对吧,就是放在外面去定义作用域就可以,在下面我们一直都可以用这个instance了。
13:02
好,那么这里我们就只简单的去实现这么一个一个方法,我们先测一下哦,下边我们现在是voing对吧?好,我们还是得把trouble,呃,纳纳掀起来,这个就不要每次都去。那么复杂的去做下载和这种n PM install对吧,这里直接一次安装到处使用了。好吧,手敲一下,看一下结果。嗯,大家可以看到这边又在部署这些相关的合约,发送相关的交易,对吧,又挂了啊。Invalid number,所以这是我们调用的时候出错了啊,它是报哪个。
14:04
所以我们在哪一步调用出了错呢?拜的时候需要传东西是吗?好,大家注意,我们在给这个呃vote details的时候,大家注意这里是不是我们是需要传一个它的地址的呀。不要把这个忘了,对吧,你要查谁的detail铁对吧?所以这个里面我们又忘记传了啊,web3.eth默认康S0,好,我们第二个测试用例也一起写一下吧,因为这里我们核心的业务逻辑是哪两个呢?一个是买,对吧,去购买代币,另外一个是投票,所以我们还是啊,就是按照我们教案跟大家一起在快速的把我们这个第二个测试用例写一下,同样还是it,那我们eat前面是可以去买,那我们后边是不是可以去投票啊,对吧,Should也是be able吧,Be able to vote for candidate,好,那么接下来。
15:17
后边跟一个方式,我们在回调里边把接下来要做的事情都写进去,那同样大家想到也应该得有一个instance对吧,要不然之后这个后面的步骤又保存不到了,别的即使没有instance一定是有的,好instance玩一个instance好,接下来大家就想到了,一开始肯定是一样的,对吧,跟上面照抄就可以。Deployed点。好,我们这里先不要打分号了啊,直接就因为后面我们是链式调用嘛,对吧?好,那么这里我就用这个箭头函数的写法,拿到这个I之后,直接就可以给到instance了,对不对啊,这里我们先拿到实例之后就先存一下,然后接下来大家想到我们这里是不是相当于又把它deploy deploy的这个拿到了一个合约实力啊,对,所以这个过程当中,其实我们还应该重新去买,然后再重新去投票,对吧,这个才会比较靠谱一点,这是不同的这个合约实力,所以呃,就是对于trouble来而言,它是每一个测试用例都会给我们重新去做部署的啊,所以这一点大家是就考虑清楚,就是trouble是给我们会自动的做完这些事情的,大家不要在上面部署了,觉得下面就不用部署了,这个肯定不行。
16:49
好,那么接下来我们,呃,那就应该return一个就可以调用了,对吧?i.BY先买一些,那我们要买多少呢?还是给一个交易对象valueweb3.from,呃,这个应该是兔尾对吧,兔尾一。
17:16
一个以态,好,那我们购买了这一个以态之后,接下来它的返回这个promise就可以拿到这个交易的收据,那当然这个东西我们没什么用了,所以就直接点赞,点赞我们这个没什么参数,也可以直接写成箭头函数的形式,对吧?好,那么接下来我们做什么事情呢?接下来是不是就可以去投票了,好,直接return。呃,比方说这个我们return一个什么东西吧,呃。接下来我们就不能用I了,对吧,得用instance instance.vote for我们的那个叫什么来着。
18:04
Vote for candidate,大家一定这个名称不要写错啊,Candidate这里面要注意我。加上他的这个参数了,对吧?你到底要给谁投好,我们这里边给爱丽丝投上十票吧,好,接下来又可以点赞,这个点赞大家就要注意,我们前面的这一个vote for candidate,相当于也是要发起一个交易,对吧?所以点赞这里拿到的还是一个收据,那我们可以不管它,但是大家也可以把它存下来,对吧?拿一个rest,然后不处理也是可以的,那么我们这里就可以直接不需要输入参数,然后接下来我们就直接继续去查询,已经投票完了之后,我们要看到底投票投上没有,那我们是不是得看看什么。
19:06
应该看什么,嗯。我们是不是应该看这个用户,他到底投投票的那个信息,对吧,我到底投给谁投了,那就是instance点。叫vote detail吧,对,这上面有啊vote detail,然后这个大家要注意web3.1,这个是要传地址的,对吧,ACCOUNT0好,我们把这个拿到,好接下来又可以在了,对吧,前面这个我们又拿到了,大家注意这里是不是这个就应该拿到它的结果啊,对吧,这个我们是真正应该拿到的,所以我们定义一个details。好,呃,那么它的details应该是什么东西呢?是一个数组对吧,我们这里要用到的其实就是它的应该是它的一。
20:06
它有两个元素,我们要用一对吧,它的零应该是当前的那个已经买的token的数量,然后一才是他投给谁的那个数量,那爱丽丝大家还记得他的那个编号是多少吗?编号是一零对吧,应该是对,所以我们要拿到的这个东西其实是detail的一零对,我们是不是想要看这个东西是不是等于十啊。对吧,它的内容是不是等于十,所以说在这里边我们就可以直接去做assert断言了,对吧,我们只需要这这一个东西,所以assert equal。DETAILS10,那大家还是把它那个value对吧。把它拿一下,它跟谁比较呢?是不是跟十比较啊,这个我们不定义变量了,就是大家也可以定义一个expected对吧?啊,这个我们就不做那么多的操作了。
21:11
好,那么大家可以看到这个里边,我们就直接做完了这个另外一个测试用例啊,当然这个如果要是不对的话,那么我们就写这个,呃,User votes for Alice should be10对吧?好,那现在我们再测试一下,我们试一下吧。T test大家可以看到这边已经把这个交易都发送过来了,对吧,大家看连续两个交易发送,大家可以看到就是这个过程的话,其实没有问题的,测试的话,正常来讲就是能够按照我们的预期去把这个输出,那我们还是给大家一点时间,把这个solidliity的测试和这个JS的测试,大家都在自己本地都实现一下,那这个测试的话,大家就直接起一个GALA就可以了,或者还有一种方法,呃,大家知道可以怎么测呢?我们是不是trouble里面内置的有一个叫做develop的东西。
22:20
Traveluff的develop它应该是什么东西呢?其实内就是内嵌的一个GA纳SH对吧,所以大家如果要是想用这个测试的话,Travel Nash,其实呃,Travel develop develop其实是更方便的,怎么样呢?就这么一起,里边大家看到已经自动生成了对应的账户,而且每一个里边都有钱,这里大家启动看看到的是9545对吧,所以跟我们这里其实不冲突,那我们在里边如果想要去做操作怎么做呢?大家看啊,直接就比方说我们要travel compel。直接打comp,他就会去做编译,那如果我们想要啊,当然这里边已经编译过了,所以就不需要对吧,如果想要去migrate,大家看直接migrate,而且这里非常快,对不对,因为就是它自己内置的,大家看到这个特别的快,如果想要test,我们直接叫test。
23:15
所以大家看到这里test它是不是先在用我们那个他扫描test文件夹对吧?下面我们首先是有那个solidliity文件,所以他先去测这个solidity里面的文件,然后测了我们下面voing这个JS文件,非常快,对不对啊,大家如果要是想用这种方式的话也可以,它会比我们这边不管是起丐纳SH还是要是思练的话,可能就更慢了,所以大家可以用这种方式做测试,这个还是没什么问题的,部署的话,我建议大家还是就是部署到思面上,这个更接近我们的,大家有条件布到那个,呃,RI或者rock更好,对吧,就是有条件的话,大家尽量在这种更真实的环境里面部署,那测试的话,我觉得在这个develop里边是完全没问题的,好,那么顺带也把develop给给大家说了一遍啊。
我来说两句