Node.js 为Strapi项目设置测试环境
我正在尝试为一个Strapi项目设置单元测试,我的代码如下所示 test_utils.jsNode.js 为Strapi项目设置测试环境,node.js,unit-testing,jestjs,strapi,Node.js,Unit Testing,Jestjs,Strapi,我正在尝试为一个Strapi项目设置单元测试,我的代码如下所示 test_utils.js const Strapi=require(“Strapi”); const http=require('http'); 举个例子;//独生子女 jest.setTimeout(10000) 异步函数setupStrapi(){ 如果(!实例){ instance=Strapi() 等待instance.load(); //运行引导功能。 wait instance.runBootstrapFunction
const Strapi=require(“Strapi”);
const http=require('http');
举个例子;//独生子女
jest.setTimeout(10000)
异步函数setupStrapi(){
如果(!实例){
instance=Strapi()
等待instance.load();
//运行引导功能。
wait instance.runBootstrapFunctions();
//冻结对象。
等待实例。冻结();
instance.app.use(instance.router.routes()).use(instance.router.allowedMethods());
instance.server=http.createServer(instance.app.callback());
}
返回实例;
}
module.exports={setupStrapi}
controllers.test.js
const request=require(“超级测试”)
const{setupStrapi,setupUser}=require(“../../test\u utils”)
描述(“聊天组控制器”,()=>{
让斯特拉皮
之前(异步()=>{
strapi=等待设置strapi()
})
测试(“端点任务”,异步(完成)=>{
app=strapi
app.server.listen(app.config.port、app.config.host)
const resp=等待请求(app.server).get(“/testpublics”)
.expect(200)
控制台日志(分别为主体)
完成()
})
})
当我运行测试时,我在“/testpublics”上得到403个错误。注意“/testpublics”是公共api,我可以从浏览器访问它
我认为问题在于setupStrapi
函数,我从node\u modules/strapi/lib/strapi.js
文件中获取了代码
为Strapi项目设置单元测试的更好方法是什么。我想实现以下目标
- 每次使用干净的数据库启动测试
- 测试公共和经过身份验证的api端点
- 我遇到了同样的问题。转到
/api/name of your api/config/routes.json
,删除每个端点的config属性
应该是这样的:
{
"routes": [
{
"method": "GET",
"path": "/testpublics",
"handler": "testpublics.index"
},
}
与此相反:
{
"routes": [
{
"method": "GET",
"path": "/testpublics",
"handler": "testpublics.index",
"config": {
"policies": []
}
},
}
如果你想通过政策公开这条路线,那么@sama bala的回答可以解决所有问题 对于Strapi,必须将非公共的自定义路由和控制器(请求标头中需要JWT令牌)分配给角色-否则,即使对于有效的令牌控制器,也将抛出禁止403错误。整个过程在认证请求中描述。此信息仅保存在数据库中。通常在管理面板中执行此操作,而不是从源代码执行 看看下面的代码片段
/**
*授予角色可以访问端点/控制器的数据库“权限”表
*
*@param{int}roleID、1个Autentichected、2个Public等
*@param{string}值,格式或点字符串,例如`“permissions.users permissions.controllers.auth.changepassword”`
*@param{boolean}已启用,默认为true
*@param{string}策略,默认值“”
*/
const grantPrivilage=async(
roleID=1,
价值
启用=真,
policy=“”
) => {
const updateObj=值
.拆分(“.”)
.reduceRight((obj,next)=>({[next]:obj}),{enabled,policy});
return wait strapi.plugins[
“用户权限”
].services.userspermissions.updateRole(roleID,updateObj);
};
它允许您通过更新数据库以编程方式将路由分配给角色。对于您的代码,解决方案可能是这样的
wait grantPrivilage(2,“permissions.application.controllers.testpublics.index”);//1是授权用户的默认角色,2是公共角色。
您可以在beforeAll
或bootstrap.js
中添加此项,例如
beforeAll(异步(完成)=>{
user=await userFactory.createUser(strapi);
等待grantPrivilage(1,“permissions.application.controllers.hello.hi”);
完成();
});
我试着在一本书中探讨这个话题