jest mock 返回 undefined

2021-02-17 22:56:26 +08:00
 lbfeng

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

1358 次点击
所在节点    JavaScript
4 条回复
red2dog
2021-02-17 23:10:28 +08:00
jest.mock('./client',()=>{ return '你要 mock 的东西' }); 你 mock 啥都没传肯定是 undefined 啊
lbfeng
2021-02-17 23:29:39 +08:00
@red2dog 你说的官方文档里有,我试过了没用。
lbfeng
2021-02-17 23:30:41 +08:00
@red2dog Calling jest.mock() with the module factory parameter https://jestjs.io/docs/en/es6-class-mocks
KuroNekoFan
2021-02-18 10:03:23 +08:00
云了一下
应该是你最后的写法里,实例化 ProductsClient 的时候,'./client'还没被 mock
试试把 jest.mock('./client');放到最顶?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/753757

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX