多次开玩笑 运行 相同的测试,但在随后的运行中崩溃

Jest running the same test multiple times, but crashes on subsequent runs

我正在尝试使用 Jest+SuperTest 为 TypeGraphQL 设置自动化测试。我看到一个错误,其中传递给查询的 argsctx 为空。发生这种情况时,我会收到 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 出了点问题,但我不知道是什么问题。现在,我将它们全部放在同一个文件中。