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 文档里也没找到类似的例子。