Асинхронный / ожидающий тест с использованием Jest Enzyme - PullRequest
0 голосов
/ 23 мая 2019

Попытка запустить тест для следующего кода с использованием 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()

Но получите следующую ошибку, используя шпион:

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

1 Ответ

1 голос
/ 25 мая 2019

Прежде всего, давайте начнем с основных концепций написания тестов.

Что мне проверить?

Все строки кода должны быть проверены, чтобы достичь максимально возможного охвата - наверняка ~ 100%. С другой стороны, процент может быть ненадежным в некоторых случаях.

Почему я должен заниматься тестами?

Тесты помогают определить, не сломаны ли предыдущие реализации из-за новых функциональных возможностей. Вам просто нужно «нажать кнопку», а не проверять ее вручную.

Существует множество других концепций как на базовом, так и на высоком уровне, но давайте постараемся сделать этот список кратким и вернемся к деталям проблемы.


Чтобы продолжить ваш пример, позвольте мне оставить несколько замечаний.

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

Это описание теста ничего не говорит о намерении этого дела. Тестирует функцию, но как? Какие части функции он охватывает? На эти вопросы действительно сложно ответить без конкретных деталей в описании.

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

Я не уверен, что такое TransactionForm, но согласно официальной документации он принимает следующие параметры:

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.
   });
});
...