玩笑错误:在调用方法时测试ES6类的调用

问题描述 投票:0回答:1

我正在使用ES6创建付款库,但是我没有进行单元测试的丰富经验,尤其是在Jest方面。我尝试模拟主类使用的两个类,在第一种情况下,我的测试工作正常,但是在第二种情况下,即使我做的情况与第一种情况相同,也无法正常工作。

我有以下代码:

import Core from './core/index';
import Providers from './providers/index';

export default class MyLib {
  #keyId = '';
  #access_token = '';
  #core = {};

  constructor(env = 'prod', auth = {}) {
    this.#core = new Core(env, auth);
  }

  getFingerprintId() {
    return this.#core.fingerprintId();
  }

  async tokenize(dataCard) {
    this.#keyId = await this.#core.getKeyId(this.#access_token);
    const provider = new Providers().getInstance();
    return await provider.tokenize(this.#keyId, dataCard);
  }
}

我想测试是否通过以下代码调用了Providers类:

jest.mock('../core/index');
jest.mock('../providers/index');

beforeEach(() => {
    sdk = new MyLib('test', {
      username: '',
      password: '',
      key: ''
      provider: '',
      country: '',
    });
  });

it('The card is tokenized', () => {
    const dataCard = {
      cardNumber: '123456789123',
      cardExpirationMonth: '12',
      cardExpirationYear: '2030',
      cardType: 'visa',
    };
    sdk.tokenize(dataCard);
    expect(Providers).toHaveBeenCalled();
  });

但是当我运行测试时,出现以下错误:

● Making test to MyLib › The card is tokenized

    expect(jest.fn()).toHaveBeenCalled()

    Expected number of calls: >= 1
    Received number of calls:    0

      31 |     };
      32 |     sdk.tokenize(dataCard);
    > 33 |     expect(Providers).toHaveBeenCalled();
         |                       ^
      34 |   });
      35 | });
      36 |

      at Object.it (src/__tests__/index.spec.js:33:23)

测试大约需要6秒钟,但会中断,为什么呢?

javascript ecmascript-6 jestjs es6-modules jest
1个回答
0
投票

Providers类的结构不够简单,无法通过自动模拟正确处理。返回的对象层次结构应该手动模拟:

let mockTokenize = jest.fn();

let mockGetInstance = jest.fn() => (
    { tokenize: mockTokenize };
);

jest.mock('../providers/index', () => (
  {
    default: jest.fn(() => (
      { getInstance: mockGetInstance }
    ))
  }
});

测试应该是异步的,并在断言之前使用链承诺:

  it('The card is tokenized', async () => {
    ...
    tokenizeMock.mockResolvedValue('whatever');
    await expect(await sdk.tokenize(dataCard)).resolves.toBe('whatever');
    expect(tokenizeMock).toHaveBeenCalledWith(...);
    // redundant assertions
    expect(Providers).toHaveBeenCalled();
    expect(getInstanceMock).toHaveBeenCalled();
  });
© www.soinside.com 2019 - 2024. All rights reserved.