1

I have Nodejs API that use Fastify. The e2e test is written with jest.

Please find my e2e test. It works and test passes. Here I find the response is same as the request parameter instead of mocking object. The actual API respond the request parameter but here I am mocking different object but it is not using it for response.

I am not sure whether passing request body is correct for POST.

Why Jest mocking is not working. The similar mocking works for unit test.


import {
  FastifyAdapter,
  NestFastifyApplication,
} from '@nestjs/platform-fastify';
import { Test, TestingModule } from '@nestjs/testing';
import request from 'supertest';
import { AppModule } from '../src/app/app.module';
import Axios, { AxiosResponse } from 'axios';
import { HttpService } from '@nestjs/common';
import { Observable, of, observable } from 'rxjs';
import { OracleDBService } from 'synapse.bff.core';

describe('AppController (e2e)', () => {
  let app: NestFastifyApplication;
  let httpService: HttpService;
  let oracleDBService: OracleDBService;
  beforeEach(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();

    app = moduleFixture.createNestApplication<NestFastifyApplication>(
      new FastifyAdapter(),
    );
    httpService = moduleFixture.get<HttpService>(HttpService);
    oracleDBService = moduleFixture.get<OracleDBService>(OracleDBService);

    await app.init();
    jest.setTimeout(30000);
  });

  it('/ (GET)', () => {
    const data = [
      { name: 'item1', code: '100', category: 'cat1', price: 1250 },
      { name: 'item2', code: '101', category: 'cat1', price: 1250 },
      { name: 'item3', code: '102', category: 'cat1', price: 1250 },
      { name: 'item4', code: '103', category: 'cat1', price: 1250 },
    ];

    const response: AxiosResponse<any> = {
      data,
      headers: {},
      config: { url: 'http://localhost:3001/item/getitem' },
      status: 200,
      statusText: 'OK',
    };

    jest.spyOn(httpService, 'get').mockReturnValue(of(response));

    return app
      .inject({
        method: 'GET',
        url: '/item/100',
      })
      .then(onresponse =>
        expect(JSON.parse(onresponse.payload)).toEqual(response.data),
      );
  });

 it('/ (POST)', () => {
    const data = {
      Name: 'item1Mock',
      Code: '500',
      Category: 'cat1Mock',
      Price: 9250,
    };
    const response: AxiosResponse<any> = {
      data,
      headers: {},
      config: { url: 'http://localhost:3001/item/getitem' },
      status: 200,
      statusText: 'OK',
    };

    jest.spyOn(httpService, 'post').mockReturnValue(of(response));
    return app
      .inject({
        method: 'POST',
        url: '/item/create',
        payload: {
          body: {
              Name: 'item1',
              Code: '200',
              Category: 'cat1',
              Price: 1250,
          },
        },
      })
      .then(onResponse =>
        expect(
          JSON.parse(onResponse.payload).message.Detail.message[0].target.body,
        ).toEqual(response.data),
      );
  });

I am getting the following error

 expect(received).toEqual(expected) // deep equality

    - Expected
    + Received

      Object {
    -   "Category": "cat1Mock",
    -   "Code": "500",
    -   "Name": "item1Mock",
    -   "Price": 9250,
    +   "Category": "cat1",
    +   "Code": "200",
    +   "Name": "item1",
    +   "Price": 1250,
      }

      90 |         expect(
      91 |           JSON.parse(onResponse.payload).message.Detail.message[0].target.body,
    > 92 |         ).toEqual(response.data),
         |           ^
      93 |       );
      94 |   });
      95 |

      at item.controller.e2e-spec.ts:92:11

user3497702
  • 695
  • 3
  • 12
  • 25

0 Answers0