У меня есть простая функция корзины, которая, когда пользователь нажимает для увеличения или уменьшения количества товара в корзине, вызывает функцию useState для обновления количества корзины в состоянии.
const [cart, setCart] = useState([]);
const onUpdateItemQuantity = (cartItem, quantityChange) => {
const newCart = [...cart];
const shouldRemoveFromCart = quantityChange === -1 && cartItem.count === 1;
...
if (shouldRemoveFromCart) {
newCart.splice(cartIndex, 1);
} else {
...
}
setCart(newCart); //the useState function is called
}
Итак, в шутку, у меня есть функция, которая проверяет, когда пользователь устанавливает количество товара в корзине на ноль, но он еще не удаляет товар из корзины, я предполагаю, потому что он еще не получил результаты setCart(newCart)
:
test('on decrement item from 1 to 0, remove from cart', () => {
const [cartItemToDecrement] = result.current.cartItems;
const productToDecrement = result.current.products.find(
p => p.id === cartItemToDecrement.id
);
act(() => {
result.current.decrementItem(cartItemToDecrement);
});
act(() => {
result.current.decrementItem(cartItemToDecrement);
});
...
expect(result.current.cartItems).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: cartItemToDecrement.id,
count: cartItemToDecrement.count - 2,
inventory: productToDecrement.inventory + 2
})
])
);
});
});
Этот тест проходит успешно, потому что в корзине теперь есть товар, количество которого упало до нуля. Но на самом деле это не должно происходить, потому что из операции splice
в onUpdateItemQuantity
наш массив cartItems
теперь не должен вообще включать объект. Как мне проверить в моем шутливом тесте, что это удаление происходит (код реакции работает правильно).