如何测试redux-saga延迟

uhry853o  于 2022-11-12  发布在  其他
关注(0)|答案(3)|浏览(181)

问题

redux-saga中,我使用的是yield delay(1000);。在单元测试中,我使用的是expect(generator.next().value).toEqual(delay(1000));
我希望考试能通过。
这是我的sagas.js

import { delay } from 'redux-saga';

export function* incrementAsync() {
  yield delay(1000);
}

这是我的sagas.test.js

import { delay } from 'redux-saga';
import { incrementAsync } from '../sagas';

describe('incrementAsync Saga test', () => {
  it('should incrementAsync', () => {
    const generator = incrementAsync();
    expect(generator.next().value).toEqual(delay(1000));
  });
});

·incrementAsync Saga 测试›应递增异步。

expect(received).toEqual(expected)

Expected value to equal:
  {"@@redux-saga/CANCEL_PROMISE": [Function anonymous]}
Received:
  {"@@redux-saga/CANCEL_PROMISE": [Function anonymous]}

Difference:

Compared values have no visual difference.

个问题

我如何测试redux-saga****延迟

bvjxkvbb

bvjxkvbb1#

测试Redux Saga 调用的一个好方法是使用call效果。在这种情况下,你可以稍微重构你的saga,如下所示:

import { delay } from 'redux-saga';
import { call } from 'redux-saga/effects';

export function* incrementAsync() {
  yield call(delay, 1000);
}

然后,您可以像这样测试:

import { delay } from 'redux-saga';
import { call } from 'redux-saga/effects';

describe('incrementAsync', () => {
  it('should incrementAsync()', () => {
    const generator = incrementAsync();

    expect(generator.next().value).toEqual(call(delay, 1000));
  });
});

这是因为对call的yield结果是一个简单的对象,描述了对delay函数的调用。
当然还有redux-saga-test-plan辅助库,使用它,您的测试将变成如下所示:

import { testSaga } from 'redux-saga-test-plan';
import { delay } from 'redux-saga';
import { call } from 'redux-saga/effects';

describe('incrementAsync', () => {
  it('should incrementAsync()', () => {
    testSaga(incrementAsync)
      .next()
      .call(delay, 1000)
      .next()
      .isDone();
  });
});
b1uwtaje

b1uwtaje2#

如果你检查delay Saga 效果代码,你可以看到它是一个绑定函数:

export const delay = call.bind(null, delayUtil)

因此,如果您在两个不同的模块中导入delay,则将是两个不同的函数,没有视觉差异
您可以在代码和框示例中检查这一点(参见测试选项卡):

const testFunction = () => {};

describe("example bound functions equality test", () => {
  it("Two bound functions are not equal", () => {
    expect(testFunction.bind(this))
      .not.toEqual(testFunction.bind(this));
  });
});

结果为:

为了测试你的 Saga 故事,你应该模拟你的delay效果(如果你使用的是Jest);

import { delay } from "redux-saga";
import { incrementAsync } from "../sagas";

jest.mock("redux-saga");

describe("incrementAsync Saga test", () => {
  it("should incrementAsync", () => {
    const generator = incrementAsync();
    expect(generator.next().value).toEqual(delay(1000));
  });
});
3ks5zfa0

3ks5zfa03#

如果任何人在使用redux-saga-test-plan软件包时遇到以下问题。
不要写“yield call(delay,600)”,这里的delay是来自“redux-saga/effects”的效果,你应该写“yield delay(600)”
您应该这样做:
saga.ts

import { delay } from 'redux-saga/effects';

export function* incrementAsync() {
  yield delay(1000);
}

saga.test.ts

import { testSaga } from "redux-saga-test-plan"
import { incrementAsync } from "./saga"

describe('incrementAsync', () => {
  test('should pass', () => {
    testSaga(incrementAsync).next().delay(1000).next().isDone();
  })
})

检测结果:

PASS   redux-saga-examples  packages/redux-saga-examples/src/stackoverflow/49263089/saga.test.ts
  incrementAsync
    ✓ should pass (3 ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 saga.ts  |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        3.208 s

软件包版本:

"redux-saga-test-plan": "^4.0.1",
"redux-saga": "^1.1.3",

相关问题