[英]Jest Error: Test ES6 class invocation when calling method
我正在使用 ES6 制作支付库,但我没有太多的单元测试经验,尤其是 Jest。 我尝试模拟我的主要 class 使用的两个类,在第一种情况下,我的测试工作正常,但在第二种情况下,即使我在第一种情况下做同样的事情,它也不起作用。
我有以下代码:
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);
}
}
我想测试提供者 class 是否正在使用以下代码调用:
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 秒并中断,这是为什么呢?
Providers
class 的结构不够简单,无法通过自动模拟正确处理。 它返回的对象层次结构应该手动模拟:
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 () => {
...
mockTokenize.mockResolvedValue('whatever');
await expect(await sdk.tokenize(dataCard)).resolves.toBe('whatever');
expect(mockTokenize).toHaveBeenCalledWith(...);
// redundant assertions
expect(Providers).toHaveBeenCalled();
expect(mockGetInstance).toHaveBeenCalled();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.