Как проверить действие REDUX, связанное с эталоном времени - PullRequest
0 голосов
/ 07 ноября 2019

Context

В настоящее время я тестирую некоторые действия REDUX для моего приложения React. Одно из этих действий хранит время, когда были получены некоторые данные, но я не уверен в том, как проверить действие.

На данный момент это грубый эквивалент действия:

export const receiveFruit = (fruitName, fruitData) => {
    return {
        type: RECEIVE_MAP,
        receivedAt: Date.now(),
        fruitName: fruitName,
        data: fruitData ? fruitData : "no_data"
    }
};

Тестирование

Теперь, что касается тестирования, я использую JEST, но, возможно, есть и другие способы протестировать вышеуказанное действие. Обычно я бы делал что-то похожее на документацию по тестированию с REDUX :

test("Should create an action to receive a fruit", () => {
    const fruitName = "banana";
    const fruitData = {isTasty: true, isBlue: false};
    const receivedAt = Date.now(); // <- Here this won't match the other action of course
    const expectedAction = {
        type: actions.RECEIVE_MAP,
        fruitName: fruitName,
        receivedAt: receivedAt,
        data: fruitData
    };
    expect(actions.receiveFruit(fruitName, fruitData)).toEqual(expectedAction)
});

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

export const receiveFruit = (fruitName, fruitData, receivedAt=Date.now()) => {
    return {
        type: RECEIVE_MAP,
        receivedAt: receivedAt,
        fruitName: fruitName,
        data: fruitData ? fruitData : "no_data"
    }
};

Хотя это решение работает, оно неэлегатно, подвержено ошибкам, есликто-то делает неправильный ввод в кодовую базу, даже если есть документация. Я верю, что может быть «умнее» способ сделать это, например, заморозить время или что-то в этом роде, но я не могу найти способ сделать это правильно.

Итак, какправильно проверить действие REDUX, содержащее временную привязку?

1 Ответ

1 голос
/ 07 ноября 2019

Вы можете макетировать функциональность, как всегда:

const mockNowFn = 
jest.spyOn(Date,'now').mockImplementation(() => 
1573149880417);
// ... write your tests here
mockNowFn.mockRestore();

, но есть и другие способы, о которых вы можете прочитать здесь: https://github.com/facebook/jest/issues/2234

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...