Jestjs 模拟取笑测试“;无效的json响应”;和“;未经处理的承诺拒绝”;错误

Jestjs 模拟取笑测试“;无效的json响应”;和“;未经处理的承诺拒绝”;错误,jestjs,enzyme,create-react-app,redux-saga,Jestjs,Enzyme,Create React App,Redux Saga,我正在尝试对我的一些redux saga生成器进行单元测试,但遇到了一些错误,我不知道如何解决。我正在使用createreact应用程序,所以我的测试套件是Jest和Enzyme 一个基本的例子: 设置:src/setupTests.js import 'jest-enzyme' import { configure } from 'enzyme' import Adapter from 'enzyme-adapter-react-16' global.fetch = require('jes

我正在尝试对我的一些redux saga生成器进行单元测试,但遇到了一些错误,我不知道如何解决。我正在使用
createreact应用程序
,所以我的测试套件是Jest和Enzyme

一个基本的例子:

设置:
src/setupTests.js

import 'jest-enzyme'
import { configure } from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'

global.fetch = require('jest-fetch-mock')

configure({
    adapter: new Adapter(),
    automock: false,
    collectCoverageFrom: [
        '<rootDir>/src/**/*.js',
        '!<rootDir>/src/**/*.stories.js',
        '!<rootDir>/node_modules/',
        '!<rootDir>/src/index.js',
    ],
    coverageThreshold: {
        global: {
            branches: 90,
            functions: 90,
            lines: 90,
            statements: 90,
        },
    },
    verbose: true,
})

import { takeEvery, put } from 'redux-saga/effects'

import {
    API_ERRORED,
    DATA_LOADED,
    DATA_REQUESTED,
} from '../constants/action-types'

export function* workerSaga() {
    try {
        const payload =
            yield fetch('https://jsonplaceholder.typicode.com/posts')
                .then(response => response.json())
        yield put({
            type: DATA_LOADED,
            payload,
        })
    } catch (e) {
        yield put({
            type: API_ERRORED,
            payload: false,
        })
    }
}

export default function* watcherSaga() {
    yield takeEvery(
        DATA_REQUESTED,
        workerSaga,
    )
}
import { put, takeEvery } from 'redux-saga/effects'
import watcherSaga, { workerSaga } from './api-saga'

import {
    API_ERRORED,
    DATA_LOADED,
    DATA_REQUESTED,
} from '../constants/action-types'

describe('saga workers', () => {
    test('should dispatch action "DATA_LOADED" with result from fetch API',
        () => {
            const articles = 'Some content'
            const mockResponse = {
                articles,
            }
            const generator = workerSaga()

            generator.next()

            expect(generator.next(mockResponse).value)
                .toEqual(
                    put({
                        type: DATA_LOADED,
                        payload: {
                            articles,
                        },
                    })
                )

            expect(generator.next().done).toBeTruthy()
        })
})
Saga测试:
src/store/sagas/api Saga.Test.js

import 'jest-enzyme'
import { configure } from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'

global.fetch = require('jest-fetch-mock')

configure({
    adapter: new Adapter(),
    automock: false,
    collectCoverageFrom: [
        '<rootDir>/src/**/*.js',
        '!<rootDir>/src/**/*.stories.js',
        '!<rootDir>/node_modules/',
        '!<rootDir>/src/index.js',
    ],
    coverageThreshold: {
        global: {
            branches: 90,
            functions: 90,
            lines: 90,
            statements: 90,
        },
    },
    verbose: true,
})

import { takeEvery, put } from 'redux-saga/effects'

import {
    API_ERRORED,
    DATA_LOADED,
    DATA_REQUESTED,
} from '../constants/action-types'

export function* workerSaga() {
    try {
        const payload =
            yield fetch('https://jsonplaceholder.typicode.com/posts')
                .then(response => response.json())
        yield put({
            type: DATA_LOADED,
            payload,
        })
    } catch (e) {
        yield put({
            type: API_ERRORED,
            payload: false,
        })
    }
}

export default function* watcherSaga() {
    yield takeEvery(
        DATA_REQUESTED,
        workerSaga,
    )
}
import { put, takeEvery } from 'redux-saga/effects'
import watcherSaga, { workerSaga } from './api-saga'

import {
    API_ERRORED,
    DATA_LOADED,
    DATA_REQUESTED,
} from '../constants/action-types'

describe('saga workers', () => {
    test('should dispatch action "DATA_LOADED" with result from fetch API',
        () => {
            const articles = 'Some content'
            const mockResponse = {
                articles,
            }
            const generator = workerSaga()

            generator.next()

            expect(generator.next(mockResponse).value)
                .toEqual(
                    put({
                        type: DATA_LOADED,
                        payload: {
                            articles,
                        },
                    })
                )

            expect(generator.next().done).toBeTruthy()
        })
})
我收到的错误是:
(节点:2009)未处理的PromisejectionWarning:FetchError:未定义的json响应主体无效原因:json输入意外结束
(节点:2009)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:2)
(节点:2009)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。
(节点:2009)未经处理的PromisejectionWarning:FetchError:未定义原因处的json响应正文无效:json输入意外结束
(节点:2009)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:4)
我认为引入
jest-fetch-mock
将有助于解决其中一些问题,但似乎并非如此。测试通过了,但这些错误仍然存在

我错过了什么


版本 redux@4.0.4
重演-saga@1.0.5
enzyme@3.10.0

jest@24.7.1

您需要设置
jest fetch mock
以返回值:

比如:

describe('saga workers', () => {
    test('should dispatch action "DATA_LOADED" with result from fetch API',
        () => {
            const articles = 'Some content'
            const mockResponse = {
                articles,
            }
            // configure the mockResponse here:
            fetch.mockResponse(mockResponse);
            const generator = workerSaga()

            generator.next()

            expect(generator.next().value)
                .toEqual(
                    put({
                        type: DATA_LOADED,
                        payload: {
                            articles,
                        },
                    })
                )

            expect(generator.next().done).toBeTruthy()
        })
})

请参见

我怀疑您的
mockResponse
具有无效的json格式。我怀疑您的
mockResponse
具有无效的json格式。