me-me
me-me

Reputation: 5819

jest-mock-extended trying to return promise value

I'm using jest-mock-extended and i'm trying to mock out a public function on a class interface thats been mocked.

Here is my IApiService

export default interface IApiService {
  send: (url: string) => Promise<any>;
}

My Test for homeService class which has only one public function called start.

import { mock } from "jest-mock-extended";
import HomeService from "./homeService";
import IApiService from "../Api/interface";

describe("HomeService", () => {
  let apiService: IApiService;
  let service: HomeService;

  beforeEach(() => {
    apiService = mock<IApiService>();
    service = new HomeService(apiService);
  });

  it("Should shit all over the place", () => {
    const mock_fetch = jest.fn(() => Promise.resolve("response"));
    apiService.send.mockReturnValue(mock_fetch);
    service.start();
    expect(mock_fetch).toBeCalled();
  });
});

I'm trying to get send method to return a mocked value but none of the functions on mock seem to work the way I'm trying to call them.

Upvotes: 1

Views: 1866

Answers (1)

Estus Flask
Estus Flask

Reputation: 222498

Since Jest spy API is used on mocked object, it should be properly typed, as suggested in the documentation:

let apiService: MockProxy<IApiService>;

This merges method types with Jest spy types, send type is something like:

((url: string) => Promise<any>) & jest.SpyInstance<Promise<any>>

Mocked function is expected to return a promise, not a function that returns a promise, so it should be mocked as:

apiService.send.mockReturnValue(Promise.resolve("response"))

or

apiService.send.mockResolvedValue("response")

Upvotes: 2

Related Questions