1

语境

我正在尝试为解析器功能的身份验证中间件编写一个笑话测试。我试图模拟一个实现,以便调用下一个函数以便测试通过。

错误

我收到的错误是“下一个不是函数”。我可以验证是否通过 调用了模拟函数expect(isAuth).toHaveBeenCalledTimes(1);,但我的模拟实现显然存在问题。任何帮助深表感谢。

代码

//isAuth Middleware

import { MiddlewareFn } from "type-graphql";
import { Context } from "../utils/interfaces/context";

export const isAuth: MiddlewareFn<Context> = ({ context }, next) => {
  const loggedInUserId = context.req.session.id;

  if (!loggedInUserId) {
    throw new Error("Not authenticated!");
  }

  return next();
};

//transaction.test.ts

jest.mock("../middleware/isAuth", () => {
  return {
    isAuth: jest.fn((_, next) => next()), //also tried (next) => next() and (next)=>Promise.resolve(next())
  };
});

test("should create a txn successfully", async () => {
      //ARRANGE
      const user = await createUser(orm);
      const txn = createTxnOptions();
      const txnToBeCreated = { ...txn, userId: user.id };

      //ACT
      const response = await testClientMutate(
        TXN_QUERIES_AND_MUTATIONS.CREATE_TXN,
        {
          variables: txnToBeCreated,
        }
      );

      //expect(isAuth).toHaveBeenCalledTimes(1); passes so it's  getting called
      console.log(response);

      const newlyCreatedTxn: Transaction = (response.data as any)
        ?.createTransaction;

      //ASSERT
      const dbTxn = await em.findOne(Transaction, {
        id: newlyCreatedTxn.id,
      });
      expect(newlyCreatedTxn.id).toBe(dbTxn?.id);
    });

//transaction.resolver.ts
import { Transaction } from "../entities/Transaction";
import {
  Arg,
  Ctx,
  Mutation,
  Query,
  Resolver,
  UseMiddleware,
} from "type-graphql";
import { Context } from "../utils/interfaces/context";
import { isAuth } from "../middleware/isAuth";

@Mutation(() => Transaction)
  @UseMiddleware(isAuth)
  async createTransaction(
    @Arg("title") title: string,
    @Arg("userId") userId: string,
    @Ctx() { em }: Context
  ): Promise<Transaction> {
    const transaction = em.create(Transaction, {
      title,
      user: userId,
    });
    await em.persistAndFlush(transaction);

    return transaction;
  }

4

1 回答 1

0

代替

jest.mock("../middleware/isAuth", () => {
  return {
    isAuth: jest.fn((_, next) => next()), //also tried (next) => next() and (next)=>Promise.resolve(next())
  };
});

jest.mock("../middleware/isAuth", () => {
  return {
    isAuth: (_, next) => next()
  };
});
于 2021-11-08T10:12:06.413 回答