Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为Strapi项目设置测试环境_Node.js_Unit Testing_Jestjs_Strapi - Fatal编程技术网

Node.js 为Strapi项目设置测试环境

Node.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

我正在尝试为一个Strapi项目设置单元测试,我的代码如下所示

test_utils.js

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”);
      完成();
      });
      
      我试着在一本书中探讨这个话题