多次开玩笑 运行 相同的测试,但在随后的运行中崩溃
Jest running the same test multiple times, but crashes on subsequent runs
我正在尝试使用 Jest+SuperTest 为 TypeGraphQL 设置自动化测试。我看到一个错误,其中传递给查询的 args
和 ctx
为空。发生这种情况时,我会收到 Cannot read property 'date' of undefined
错误。
这只发生在自动化测试期间,而不是当我从 graphQL 游乐场点击解析器时。它也适用于我首先发送的登录突变,但在 getAll 查询时崩溃。
调试的时候发现同一个测试是运行两次,这让我很st运行ge。它似乎第一次通过而第二次失败。 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 脚本开个玩笑:
"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.*',
};
当我最终在 Google 而不是 DuckDuckGo 上搜索时,我发现很多人在使用 TS 时遇到同样的问题。 None 这些解决方案虽然对我有用,但它可能只是一个活跃的错误:https://github.com/kulshekhar/ts-jest/issues/1342
我只用了很少的时间就切换到了 Mocha+Chai,现在可以完美运行了。希望我早点完成它,但我很高兴它现在可以正常工作了。
编辑:
最终 Mocha 运行 遇到了同样的问题,其中一些请求失败,而其他请求的 args+ctx 为空。为了解决这个问题,我最终将所有测试移到了同一个测试文件中。我的测试 teardown/setup 出了点问题,但我不知道是什么问题。现在,我将它们全部放在同一个文件中。
我正在尝试使用 Jest+SuperTest 为 TypeGraphQL 设置自动化测试。我看到一个错误,其中传递给查询的 args
和 ctx
为空。发生这种情况时,我会收到 Cannot read property 'date' of undefined
错误。
这只发生在自动化测试期间,而不是当我从 graphQL 游乐场点击解析器时。它也适用于我首先发送的登录突变,但在 getAll 查询时崩溃。
调试的时候发现同一个测试是运行两次,这让我很st运行ge。它似乎第一次通过而第二次失败。 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 脚本开个玩笑:
"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.*',
};
当我最终在 Google 而不是 DuckDuckGo 上搜索时,我发现很多人在使用 TS 时遇到同样的问题。 None 这些解决方案虽然对我有用,但它可能只是一个活跃的错误:https://github.com/kulshekhar/ts-jest/issues/1342
我只用了很少的时间就切换到了 Mocha+Chai,现在可以完美运行了。希望我早点完成它,但我很高兴它现在可以正常工作了。
编辑:
最终 Mocha 运行 遇到了同样的问题,其中一些请求失败,而其他请求的 args+ctx 为空。为了解决这个问题,我最终将所有测试移到了同一个测试文件中。我的测试 teardown/setup 出了点问题,但我不知道是什么问题。现在,我将它们全部放在同一个文件中。