Протестируйте побочные эффекты в действиях Redux

Я работаю с руководством по Redux, которое можно найти здесь.

В приложении, которое я создал, у меня есть действие с побочным эффектом, как показано здесь в функции receivePosts, где вызывается Date.now().

Побочный эффект запускается после завершения асинхронной функции. При выполнении этого асинхронного теста в моем собственном приложении. Я получаю ответ, похожий на это:

actual: 
{ 
  type: 'REQUEST_LEAGUE_SUCCESS',
  receivedAt: 1453991947254,
  league: 'Div 3',
  resultsTable: [ [Object], [Object] ] 
},

expected: 
{ 
  type: 'REQUEST_LEAGUE_SUCCESS',
  league: 'Div 3',
  receivedAt: 1453991947235,
  resultsTable: [ [Object], [Object] ]
}

где дата моего ожидаемого действия не равна дате фактического действия. В моем ожидаемом действии у меня есть следующее:

receivedAt: Date.now()

Структура моего кода точно такая же, как и в руководстве по Redux, за исключением того, что мой создатель действий имеет этот побочный эффект.

Мой вопрос сводится к следующему: как справиться с этими побочными эффектами, чтобы мои тесты прошли?


person jollelj    schedule 28.01.2016    source источник


Ответы (3)


Тестовый код, основанный на захвате текущего времени, не является хорошей идеей. Вам нужно будет переписать вещи, чтобы вы могли сымитировать или вставить дату. Несколько хороших примеров того, как это сделать: (Модульные тесты, как писать тестируемый код и почему это важно). Эта статья основана на C#, но здесь применяется та же концепция.

person markerikson    schedule 28.01.2016

Вы можете издеваться над функцией Date.now() следующим образом:

describe('>>> Test Name', () => {
    const literallyJustNow = Date.now();
    const realDateNow = Date.now.bind(global.Date);
    const dateNowStub = jest.fn(() => literallyJustNow);

    beforeEach(() => {
        global.Date.now = dateNowStub;
    });

    afterEach(() => {
        global.Date.now = realDateNow;
    });

    it('... your tests ...', () => { ... });
});
person Vaibhav Vishal    schedule 28.01.2019

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

person Aaron    schedule 28.01.2016