框架里有个 Trait 叫 Test/ApiClient ,使用它我们可以测试 HTTP 请求相关的功能 .. 比如去测试应用的 REST 接口 ..
打开 post 这个测试 ... 复制一份这个测试 ... 测试的标题是 get list of posts .. 在这个测试里我们看一下能不能正常得到一组文章内容 ..
在这个 Test suite 里面,再用一个 trait .. 名字是 Test/ApiClient .. 这样在测试方法的 context 参数里面,又多了一个叫 client 的东西 .. 它其实就是一个 http 的客户端,可以使用它去发出各种 http 请求 ..
方法里先创建了一条内容数据,然后我们可以使用这个 client 去请求得到一个内容列表,再断言创建的这个文章记录在这个内容列表里面 ..
再打开 PostController ... 处理内容列表请求用的是 index 方法 .. 在这里可以根据客户端指定的内容格式,响应回不同类型的数据 .. 添加一个 format .. request.accepts .. json .. html ...
下面判断一下 .. 如果 format 是 json 的话 .. 我们响应的就是 response.send .. posts ... 就是响应回一组 json 格式的数据 .. 把需要用的这个 respnose 解构出来 ...
再回到测试 .. 在 get list of posts 这个测试里面,添加一个 response ... await .. 用一下 client 上面的 get ,发出 get 类型的请求 .. 地址用一下 Route.url ... 路由的名字是 posts.index ..
在测试里面,再导入这个 Route ..
然后在这个 get 请求里可以再用一个 header 方法,设置一下请求的头部 .. 添加一个 accept .. 值是 application/json ... 意思就是客户端这里需要 json 类型的数据 ... 控制器那里知道什么时候应该返回什么类型的数据 ... 请求结束,再用一个 end 方法 ..
断言
下面我们可以在这个得到的 response 上面去做一些断言 .. 比如要断言响应的状态码,可以这样,用一下 response.assertStatus .. 断言状态码是 200 ...
然后再用一下 response.assertJSONSubset .. 看看上面创建的这条数据是不是在响应的数据里面 .. 一个对象 .. 因为我们在内容列表上用了分页 .. 所以具体的数据是在 data 这个属性里面 .. 一个数组 .. 里面添加一个 post ..
回到命令行 .. 执行一下 adonis test ... 运行一下测试 .. 会提示测试都通过了 ..
回到这个测试 .. 可以注释掉创建这个数据记录的代码 ...
然后再试着运行一下测试 ... 这回这个 get list of posts 这个测试没有通过 ..
因为在响应回来的内容列表里没找到我们设置的内容 ...
再修改一下 ... 取消注释创建内容的代码 ..... 然后再运行一下测试 ... 这回所有测试又会全部通过 ...