下面我们写几个测试,测试一下创建用户这个接口。用一个 describe 组织一组测试,测试创建用户接口,一个回调函数参数,在里面可以继续用 test 创建需要的测试,先测试一下创建用户时必须提供用户名。一个回调函数参数。
在这个测试里可以先请求一下要测试的应用接口,声明一个 response,它的值就是请求 创建用户 接口得到的响应。用 request ,把 app 交给它,接着调用 post 方法,请求的接口地址是 /users。 请求里要包含的主体数据可以交给 send 方法,在这个数据里面只提供一个 password 属性,对应的值是之前在上面准备好的这个 testUser 里的 password 。
下面可以对这个响应做出一些断言,expect 期望 response.stauts,响应里的状态码应该等于 400, 然后 expect response.body,响应的主体数据 toEqual ,一个对象,里面有个 message ,属性的值是 请提供用户名。
打开 user.router,可以观察一下在这里定义的 创建用户 接口,在这个接口上我们用了一个 valdiateUserData 这个中间件。它会检查客户端提供的创建用户数据。
打开 user.middleware ,找到在这里定义的 validateUserData 中间件, 在这个中间件里,会把请求主体里的 name 还有 password 解构出来,然后做出一些判断,如果没有提供 name 的值,就会触发一个异常,错误信息是 NAME_IS_REQUIRED。
异常会交给异常处理器去处理,打开 app.middleware ,找到在这里定义的异常处理器,然后找到 NAME_IS_REQUIRED 这个错误情况,你会发现,在应用里发生这种错误的时候,会把响应的状态码设置成 400,响应的信息就是 请提供用户名。
再回到 user.test 测试,在这个测试里,我们断言如果在请求创建用户接口的时候,没有在请求的主体里面包含 name 属性的值,得到的响应数据里面就会包含一个 message 属性,属性的值是 请提供用户名,响应的状态码是 400 。
复制一份这个测试,再测试另外一种情况,创建用户名必须提供密码,修改一下请求里的主体数据,只添加一个 name 属性,对应的值是 testUser 里的 name 。
修改一下做出的断言,断言响应的状态码是 400,响应的主体数据是个对象,里面有个 message 属性,属性的值应该是 请提供用户密码。
下面再用 test 创建一个测试,测试的是成功创建用户以后,响应的状态码应该是 201。 提供一个函数参数,在这个测试里面同样可以先去请求要测试的接口,声明一个 response,等于 await ,用 request,把 app 交给它,然后用 post 方法请求 /users 这个地址,再用 send 带着请求里的主体数据,这个数据就是 testUser 里的数据。
上面这个请求会在应用里创建一个测试用户,下面可以设置一下创建的这个测试用户,设置一下 testUserCreated 的值,这个东西就是之前我们在这个测试文件里准备好的,它的值应该是在测试里创建的这个测试用户相关的数据。
用 getUserById 调取用户数据,把要调取的用户的 id 告诉它,这里就是 response.body.insertId 这个属性的值。 提供一个选项参数,然后把 password 设置成 true,这样会在用户数据里包含用户的密码字段的值。
下面可以对这个响应做出一些断言, expect 响应的状态码应该等于 201 。
回到终端,运行一下测试 ~ 如果测试的结果符合我们在测试中做出的断言,测试就会全部通过。