为什么我用 Jest 模拟后才使用实际的库?

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

有很多类似的问题,但我找不到任何可以解决我的问题。

我正在使用 jest.mock 来模拟 Plaid 库,如下所示:

jest.mock('plaid', () => ({
  Configuration: jest.fn(),
  PlaidApi: jest.fn(() => ({
    linkTokenCreate: jest.fn(),
    itemPublicTokenExchange: jest.fn(),
    transactionsSync: jest.fn(),
  })),
  PlaidEnvironments: {
    sandbox: 'https://sandbox.plaid.com',
  },
}))

然后像这样初始化它:

describe('Plaid', () => {
  let plaid: Plaid
  let plaidApiMock: jest.Mocked<PlaidApi>

  beforeAll(() => {
    plaidApiMock = new PlaidApi({} as Configuration) as jest.Mocked<PlaidApi>
    plaid = new Plaid()
  })

// ... the rest of the tests

其中

Plaid
是我正在测试的包装类。但在测试中,包装类和测试仍然使用真实的库
PlaidApi
。这正是我在其他测试中用来模拟库的方法,并且它有效,所以我在这里真的迷失了。

我找到了一个潜在的解决方案,即将我的模拟代码更改为:

jest.mock('plaid', () => ({
  __esModule: true,
  default: {
    Configuration: jest.fn(),
    PlaidApi: jest.fn(() => ({
      linkTokenCreate: jest.fn(),
      itemPublicTokenExchange: jest.fn(),
      transactionsSync: jest.fn(),
    })),
    PlaidEnvironments: {
      sandbox: 'https://sandbox.plaid.com',
    },
  },
}))

这没有改变任何事情。

您能帮助我,告诉我去哪里寻找或者分享您的经验吗?谢谢你。

unit-testing jestjs plaid
1个回答
0
投票

同事的建议:“我注意到你提到有自己的 Plaid 包装类。由于它似乎是用

plaid = new Plaid()
构建的,因此可能会在
PlaidApi
的构造函数中创建一个单独的
Plaid
,这将与您之前在测试设置过程中创建的
plaidApiMock
不同。一个建议可能是重构,以便
Plaid
包装类的构造函数采用
PlaidApi
作为参数,并将
plaidApiMock
传递给 for 。单元测试。”

© www.soinside.com 2019 - 2024. All rights reserved.