【问题标题】:Test side effects in Redux actions在 Redux 操作中测试副作用
【发布时间】:2016-01-28 14:45:07
【问题描述】:

我正在学习 here 的 Redux 教程。

在我创建的应用程序中,我有一个带有副作用的操作,就像在调用 Date.now() 的 receivePosts 函数中显示的 here 一样。

在异步函数完成后触发副作用。在我自己的应用程序中关注 this async test 时。我收到如下回复:

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 教程中的代码完全相同,除了我的动作创建器有这个副作用。

我的问题归结为:如何处理这些副作用以使我的测试通过?

【问题讨论】:

    标签: javascript redux redux-thunk nock


    【解决方案1】:

    依赖于获取当前时间的测试代码不是一个好主意。您需要重写一些东西,以便您可以模拟或注入日期。在 (Unit Tests, How to Write Testable Code and Why it Matters) 上有一些很好的例子。那篇文章是基于 C# 的,但同样的概念也适用于此。

    【讨论】:

      【解决方案2】:

      你可以像这样模拟 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 ...', () => { ... });
      });
      

      【讨论】:

        【解决方案3】:

        我认为您需要在测试中建立一些容忍度,因为在调度操作和接收响应之间不可避免地会经过一些时间。即使你伪造它,执行时间仍然会有差异。您实际如何执行此操作取决于您的断言库。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-04
          • 1970-01-01
          • 2016-02-21
          • 1970-01-01
          • 1970-01-01
          • 2017-03-03
          • 2018-08-06
          • 2012-07-18
          相关资源
          最近更新 更多