client.js
module.exports = class ProductsClient {
async getById(id) {
const url = `http://localhost:3000/api/products/{id}`;
const response = await fetch(url);
return await response.json();
}
}
manager.js
const ProductsClient = require('./client');
module.exports = class ProductManager {
async getProductToManage(id) {
const productsClient = new ProductsClient();
const productToManage = await productsClient.getById(id)
.catch(err => alert(err));
return productToManage;
}
}
test.js
const ProductsClient = require('./client');
const ProductManager = require('./manager');
jest.mock('./client');
describe('test', () => {
test('111', async () => {
const expectedProduct = {
id: 1,
name: 'football',
};
const mockGetById = jest.fn();
mockGetById.mockResolvedValue(expectedProduct);
ProductsClient.prototype.getById = mockGetById;
const productManager = new ProductManager();
const result = await productManager.getProductToManage(1);
expect(result.name).toBe('football');
})
})
在 test.js 中 mock client 完全没问题。一旦把const productsClient = new ProductsClient();
拿到class ProductManager
外,getById
就返回 undefined
const ProductsClient = require('./client');
const productsClient = new ProductsClient();
module.exports = class ProductManager {
async getProductToManage(id) {
const productToManage = await productsClient.getById(id) // undefined
.catch(err => alert(err));
return productToManage;
}
}
jest mock module 文档里也没找到类似的例子。
1
red2dog 2021-02-17 23:10:28 +08:00
jest.mock('./client',()=>{ return '你要 mock 的东西' }); 你 mock 啥都没传肯定是 undefined 啊
|
3
lbfeng OP @red2dog Calling jest.mock() with the module factory parameter https://jestjs.io/docs/en/es6-class-mocks
|
4
KuroNekoFan 2021-02-18 10:03:23 +08:00
云了一下
应该是你最后的写法里,实例化 ProductsClient 的时候,'./client'还没被 mock 试试把 jest.mock('./client');放到最顶? |