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