使用Jest酶进行异步/等待测试

时间:2019-05-23 20:30:03

标签: unit-testing async-await jestjs

尝试使用Jest和Enzyme对以下代码运行测试。该代码实际上正在传递,但不影响其覆盖范围。只是想知道我可以添加什么才能正常工作并增加测试覆盖率

这是函数:

async getCurrencies() {
  const { user, services } = this.props;
  let types = response.body ? response.body.value : null;
  let response = await DropdownModels.getCurrencies({ user, services })
  let temp = types.map((type) => {        
    return {
     label: type.Name,
     value: type.Currency1,
   }
  })
 this.setState({ CurrencyOptions: temp });
}

这是我的测试用例:

it ('Test getCurrencies function ',async() => {
 wrapper.setProps({
    user:{},
    serviceS:{},
  })
 wrapper.find('TransactionForm').setState({
    CurrencyOptions:[[]]
   });
 wrapper.update();
 await expect(wrapper.find('TransactionForm').instance().getCurrencies('test')).toBeDefined();
});

也尝试了以下方法

const spy = jest.spyOn(wrapper.find('TransactionForm').instance(), 'getCurrencies');
await expect(spy).toBeCalled()

但是使用spy会出现以下错误:

   expect(jest.fn()).toBeCalled()
   Expected mock function to have been called.

1 个答案:

答案 0 :(得分:1)

首先,让我们从编写测试的基本概念开始。

我应该测试什么?

所有代码行都应该经过测试,以实现尽可能高的覆盖率-肯定是〜100%。另一方面,在某些情况下,该百分比可能不可靠。

我为什么要处理测试?

测试有助于确定以前的实现是否由于新功能而被破坏。您只需要“按一下按钮”即可,而无需手动进行验证。

在基本和高级方面还有许多其他概念,但让我们尝试使清单简短,然后跳回问题的详细内容。


为了坚持上面的例子,让我留下一些看法。

it('Test getCurrencies function', async () => { ... });

此测试描述未说明此案的意图。它测试功能,但是如何?它涵盖功能的哪些部分?没有描述中的具体细节,很难回答这些问题。

const spy = jest.spyOn(wrapper.find('TransactionForm').instance(), 'getCurrencies');

我不确定TransactionForm是什么,但是根据official documentation,它接受​​以下参数:

jest.spyOn(object, methodName)

您确定wrapper.find('TransactionForm').instance()返回一个对象并且还包含getCurrencies函数吗?

let response = await DropdownModels.getCurrencies({ user, services });

DropdownModels也有一个getCurrencies方法,这很奇怪-也令人困惑。这可能不是问题,但我宁愿考虑将其重命名。


最后,下面是一些测试用例示例,它们可能是您的案例的一个很好的起点:

describe("getCurrencies", () => {
   it("calls `DropdownModels.getCurrencies` with `user` and `services` props", () => {
      // Don't forget to set the desired props as you did it in your samples.
      // Simply mock `DropdownModels.getCurrencies` with `jest.spyOn`.
   });

   it("sets `temp` into the state", () => {
      // Test whether the expected data is set into the state.
   });
});