【发布时间】:2021-03-11 10:20:10
【问题描述】:
我正在尝试使用 Jest+SuperTest 为 TypeGraphQL 设置自动化测试。我看到一个错误,其中传递给查询的args 和ctx 为空。发生这种情况时,我会收到 Cannot read property 'date' of undefined 错误。
这只发生在自动化测试期间,而不是当我从 graphQL 游乐场点击解析器时。它也适用于我首先发送的登录突变,但在 getAll 查询时崩溃。
调试的时候发现同一个测试跑了两次,这让我很奇怪。它似乎第一次通过,第二次失败。 Jest 报告 1 个测试失败和 1 个通过,但只有这一个测试正在运行。它似乎在第一次运行时失败并在第二次运行时通过,但我想我已经看到它也以相反的方式工作。
Test Suites: 1 failed, 2 skipped, 1 passed, 2 of 4 total
Tests: 1 failed, 6 skipped, 1 passed, 8 total
测试设置
beforeAll(async () => {
request = supertest(http.createServer(await createMyAppServer()));
sendReq = reqSender(request);
});
afterAll(async (done) => {
//nothing
})
//test
test("get All with login", async (done: any) => {
let loginResp;
loginResp = await sendReq(TEST_VALID_LOGIN_GQL);
let firstCookie = loginResp.cookie;
let getAllResp = await sendReq(`query {
getAllModelName {
id
}
}`,
firstCookie,200,true);
expect(getAllResp.text.data[`getAllModelName`].length).toBeGreaterThan(0);
}
done();
});
//request sender (for reference, can ignore)
export function reqSender(requestServer:any){
return async function sendReq(
gql: string,
prevCookie: any = [],
expectedStatus = 200,
logErr = false
) {
let fullResp: any;
let cookie: any;
gql = gql.replace("\n","");
try {
let resp = await requestServer
.post("/graphql")
.send({
query: gql,
})
.set("Accept", "application/json")
.set("cookie", prevCookie)
.set("Content-Type", "application/json")
.then((resolver: any, rejector: any) => {
if (rejector) throw rejector;
fullResp = resolver.res as any;
cookie = fullResp.headers["set-cookie"];
try{
expect(fullResp.headers['content-type'].includes("application/json")).toEqual(true);
expect(fullResp.statusCode).toEqual(expectedStatus)
}catch(e){
console.error(fullResp.text);
throw e;
}
});
} catch (e) {
console.error("request= " + gql);
console.error(e);
throw e;
}
let errs = JSON.parse(fullResp.text).errors;
if(errs && logErr) console.error(errs);
return { cookie, fullResp, text: JSON.parse(fullResp.text) };
};
}
解析器父级
@ArgsType()
export class CommonArgs {
@Field({ nullable: true })
date: Date;
}
export function createBaseResolver<T extends UserCreatedEntity>(suffix: string, objectTypeCls: T) {
@Query(type => [objectTypeCls], { name: `getAll${suffix}` })
async getByDateQuery(@Args() args: CommonArgs, @Ctx() ctx: any): Promise<T> {//ISSUE HERE :: args and ctx are null
let where = {} as any;
if (args.date) where.date = (Between(startOfDay(args.date).toISOString(), endOfDay(args.date).toISOString()) as any); //ERROR here, if I remove this then ctx will throw an error when I try to use vars on it.
return this.getAll(where, ctx);
}
async getAll(whereArgs: any, ctx: any): Promise<T> {
this.checkForLogin(ctx);
let beCastedObj = (<typeof UserCreatedEntity>(objectTypeCls as any));
let findArgs = {} as any;
findArgs.where = whereArgs || {};
findArgs.where.userCreator = { id: ctx.req.session.userId };
let entities =[];
entities = await beCastedObj.find(findArgs) as any;
entities.forEach((e: any) => {
this.checkCanView(ctx, e);
});
return entities;
}
}
解析器
@Resolver(of => ModelName)
export class ModelNameResolver extends BaseResolver {
}
通过 npm 脚本运行 jest:
"startServer": "NODE_PATH=./src DEBUG=express:* NODE_ENV=dev nodemon -w src --ext ts --exec node --inspect -r tsconfig-paths/register -r ts-node/register src/index.ts",
"testDebug": "NODE_ENV=test npx --debug-brk=5858 jest --runInBand --testTimeout=10000",
"test": "NODE_ENV=test jest --runInBand --testTimeout=10000"
jest.config.ts
const { pathsToModuleNameMapper } = require('ts-jest/utils');
const { compilerOptions } = require('./tsconfig');
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { prefix: '<rootDir>/src/' } ),
testNamePattern: 'get All.*',
};
【问题讨论】:
标签: javascript jestjs graphql supertest typegraphql