gpt4 book ai didi

javascript - 当有函数不使用 'yield' 或类似 'call' 或 'put' 的效果时如何测试 sagas?

转载 作者:行者123 更新时间:2023-11-30 13:53:20 26 4
gpt4 key购买 nike

在所有示例中,我发现每个人都在他们的传奇中使用 yield call()yield put() 等。现在我有一个 saga,它只执行一个函数而不使用 yield call()。此函数在选择效果之后和调用效果之前执行(请参阅下面的代码了解 service 变量。此函数返回类的实例,它不是网络请求或 promise 。

传奇工作正常,但我不确定如何像这样测试它。使用 redux-sagas-test-plan 效果很好,但是一旦我删除效果(我从 .provide() 中删除,测试失败。

传奇

export function* getDetails() {
try {
const config = yield select(getProperties());
const service = getService(config);
const data = yield call([service, service.getDetails]);
yield put(success(data));
} catch(e) {
yield put(failure());
}
}

测试

import { getDetails as detailsSaga } from '...';
const data = {};

it('should succeed getting details', async () => {
await expectSaga(detailsSaga)
.provide([
[select(getProperties), {}],
[call([serviceMock, serviceMock.getDetails]), data]
])
.put(success(data))
.dispatch(fetchDetails())
.silentRun();
});

测试的预期结果是让 success(data) creator 执行,但我得到 failure() creator 作为实际值。

Expected
--------
{ '@@redux-saga/IO': true,
combinator: false,
type: 'PUT',
payload:
{ channel: undefined,
action:
{ type: 'FETCH_DETAILS_SUCCESS',
data: { } } } }

Actual:
------
1. { '@@redux-saga/IO': true,
combinator: false,
type: 'PUT',
payload:
{ channel: undefined,
action: { type: 'FETCH_DETAILS_FAILURE' } } }

最佳答案

根据我找到的其他示例,这是我的解决方案:

import { call } from 'redux-saga-test-plan/matchers';

beforeEach(() => {
service = getService({});
data = { /* ... */ });
});

it('should succeed getting details', async () => {
await expectSaga(detailsSaga)
.provide([
[select(getProperties), {}],
[call.fn(service.getDetails), data]
])
.put(success(data))
.dispatch(fetchDetails())
.silentRun();
});

我必须使用 redux-saga-test-plan/matchers 的调用效果并创建由 getService 返回的实际实例。由于某种原因,模拟在这里不起作用。

我不太清楚为什么这样做的细节,但我写下这个答案是为了以防万一有人也试图实现这一目标。注意:我同意其他答案,所有函数都应该使用 yield call 调用,但我被要求不要在这里这样做。

关于javascript - 当有函数不使用 'yield' 或类似 'call' 或 'put' 的效果时如何测试 sagas?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57779103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com