How do I write tests for resolvers?

Does anyone have examples of tests for the default forge resolver?

The default resolver for a forge project index.js is:

import Resolver from '@forge/resolver';

const resolver = new Resolver();

resolver.define('getText', (req) => {
  console.log(req);
  return 'Hello, world!';
});

export const handler = resolver.getDefinitions();

How would I write a test for this class? This is what I think it should be as follow, but I get the errors TypeError: Cannot read properties of undefined (reading 'define'):

import Resolver from '@forge/resolver';
import { handler } from './index';

jest.mock('@forge/resolver');

describe('handler', () => {
  let mockDefine;
  let mockGetDefinitions;

  beforeEach(() => {
    mockDefine = jest.fn();
    mockGetDefinitions = jest.fn();

    Resolver.mockImplementation(() => ({
      define: mockDefine,
      getDefinitions: mockGetDefinitions,
    }));

    jest.resetModules();
    require('./index');
  });

  it('should define getText and return Hello, world!', () => {
    const req = { foo: 'bar' };
    const consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {});
    let getTextHandler;

    mockDefine.mockImplementation((name, fn) => {
      if (name === 'getText') {
        getTextHandler = fn;
      }
    });

    jest.resetModules();
    require('./handler');

    const result = getTextHandler(req);

    expect(consoleSpy).toHaveBeenCalledWith(req);
    expect(result).toBe('Hello, world!');

    consoleSpy.mockRestore();
  });
});

Hi @CAlbertThompson, I think this error might be happening because the handler isn’t being properly created since the Resolver class is being mocked. If you remove the @forge/resolver/Resolver mocks, the handler will be created per-usual. You can then invoke the resolver function by calling await handler({call: {functionKey: 'getText'}, context: req}).

If you’re just interested in testing the functionality of your resolver function, you can also define the resolver function in an exported constant and test that directly.

Let me know if you have any further questions!

Thanks,
Lily