Javascript 在GraphQL变异中传递createReadStream(jest测试目的)
我正在努力在变异查询中传递createReadStream 我所做的是开玩笑,如下所示Javascript 在GraphQL变异中传递createReadStream(jest测试目的),javascript,jestjs,graphql,Javascript,Jestjs,Graphql,我正在努力在变异查询中传递createReadStream 我所做的是开玩笑,如下所示 const createReadStream=jest.fn(); 我就是这样用的 文件:{ 文件名:“惊奇漫画(1.pdf”, mimetype:“application/pdf”, 编码:“7bit”, createReadSteam:${createReadStream} } 这是完整的代码 从'jeto'导入{initResources}; 从“graphql”导入{graphql}; 从'ram
const createReadStream=jest.fn();
我就是这样用的
文件:{
文件名:“惊奇漫画(1.pdf”,
mimetype:“application/pdf”,
编码:“7bit”,
createReadSteam:${createReadStream}
}
这是完整的代码
从'jeto'导入{initResources};
从“graphql”导入{graphql};
从'ramda'导入{prop,path};
从“../services”导入initServices;
从“../init/http”导入initHttp;
从“../init/models”导入initModels;
从“/initConfig”导入initConfig;
从“../init/database”导入initDatabase;
从“../init/router”导入initRouter;
从“../dataLoaders”导入initDataLoaders;
从“../init/apollo”导入initApollo;
从“../../lib/api”导入api;
从“../../lib/models/people”导入{ROLE};
从“/utils”导入{login};
//从“/utils/resumesTests”导入{resumes};
//从“/utils/usersTests”导入{userAdmin、userHeadHunter、userSales、userWorker};
让MONGO;
让服务器;
让runql;
让CTX;
让GCTX;
让轮廓;
const TENANT={key:'TENANT'};
描述('server | graphql | resume',()=>{
之前(异步()=>{
常量资源=[
initConfig,
初始化数据库,
初始化模型,
初始化数据加载程序,
初始服务,
阿波罗号,
初始化路由器,
initHttp,
];
返回初始资源(资源)
。然后(异步ctx=>{
CTX=CTX;
const{httpServer,mongo,models}=ctx();
MONGO=MONGO;
SERVER=httpServer;
const tenantId=wait models.tenants.collection.insertOne(TENANT).then(prop('insertedId'));
租户。_id=租户id;
config({endpoint:httpServer.url,tenant:tenant.key});
const{user}=wait login(模型,租户,[ROLE.admin]);
GCTX={
用户,
ctx:ctx,
models:CTX().models(用户,{authRequired:true,…租户}),
数据加载程序:CTX()。数据加载程序,
};
runql=异步查询=>{
log('query',query);
const res=await graphql(CTX().apollo.schema,query,null,GCTX);
console.log('res',res);
如果(res.errors)抛出res.errors[0];
返回res;
};
})
.catch(()=>{
if(MONGO){
MONGO.database.dropDatabase();
MONGO.close();
}
});
});
毕竟(()=>{
返回MONGO.database
.dropDatabase()
.然后(()=>SERVER.close())
.然后(()=>MONGO.close());
});
它('应该添加简历',异步()=>{
const createReadStream=jest.fn();
常量查询=`
突变{
创建简历(
状态:正在检查,
名字:“马修”,
姓氏:“Chedid”,
电子邮件:“mchedid@gmail.com",
电话号码:“+339494854”,
评级:5,
资历:6岁,
硬技能:[“6048d850735ec00ec36db0d9”、“6048d850735ec00ec36db0c4”、“6048d850735ec00ec36db0b8”],
软技能:[],
评论:“,
文件:{
文件名:“惊奇漫画(1.pdf”,
mimetype:“application/pdf”,
编码:“7bit”,
createReadSteam:${createReadStream}
}
){u id}}`;
PROFILE=wait runql(查询),然后(path(['data','createResume']);
expect(PROFILE._id).toBeDefined();
});
控制台日志
GraphQLError[Object]:语法错误:应为名称,找到“(”。
当我摆脱
createReadSteam:${createReadStream}
从文件和重新开始测试,我可以在控制台中观察到这一点
Error: ‘Upload’ scalar literal unsupported.
1st:变异参数应始终作为变量传递- 根本不可能在查询中传递硬编码的文件/上传! 第二步:graphQL上传通常按照中所述的两步流程实施:
- 预处理-使用经典的后多部分表单数据编码数据集和
(包含graphql操作
和稍后处理的参数-突变加“查询”
-非文件和空文件参数),“变量”
(文件到查询变量映射)和文件映射
- 传递给正常处理的查询(变异)得到更新,文件变量现在是上传标量(取决于实现)-具有名称的对象,上传的文件/流句柄
正如@xadm提到的,解决方案是将上传的文件添加到查询旁边,并修改runql方法以添加参数->变量
it('should add resume',async()=>{
const stream=Readable.from(Buffer.from('coucou'));
常量查询=`
突变
createResume($file:Upload)
{
创建简历(
文件:$file,
名字:“马修”,
姓氏:“chedid”,
电子邮件:“mchedid@gmail.com",
电话号码:“+33617825408”
状态:待定,
资历:1,
硬技能:[“6048d850735ec00ec36db0d9”]
){u id,firstname}
}
`;
const file=Promise.resolve({
createReadStream:()=>流,
流动
文件名:'./resume.pdf',
mimetype:`application/pdf`,
});
RESUME=wait runql(查询,{file});
期望(RESUME._id).toBeDefined();
expect(简历,名字),toEqual('mathieu');
});
runql=async(查询,变量={})=>{
常数res=aw