无法创建Jest模拟功能

时间:2019-07-23 21:06:53

标签: reactjs unit-testing mocking jestjs

我是Jest模拟的新手,我已经阅读了有意义的资源,但是我采用的方法不起作用。

正在测试的代码:

// @flow
import type {
  RecipeAction,
  CREATE_RECIPE_START
} from "../reducers/recipesReducer";
import Recipe from "../../models/Recipe";
import type { RecipeApiObject } from "../../models/Recipe";
import type { Saga } from "redux-saga";
import { put, call, takeEvery, all } from "redux-saga/effects";

export function submitRecipe(recipeObj: RecipeApiObject): CREATE_RECIPE_START {
  return { type: "CREATE_RECIPE_START", recipeObj };
}

function submitRecipeApi(recipeObj: RecipeApiObject): RecipeApiObject {}

export function* submitRecipeSaga({recipeObj}: {
  recipeObj: RecipeApiObject
}): Saga<void> {
  const response = yield call(submitRecipeApi, recipeObj);
  yield put(response);
}

export default function* recipeSaga(): Saga<void> {
  yield all([yield takeEvery("CREATE_RECIPE_START", submitRecipeSaga)]);
}

我正在尝试测试submitRecipeSaga,而没有触及最终将调用该API的submitRecipeApi

// @flow
import mockRecipes from "../../src/api-data/recipes";
import recipeSaga, {
  submitRecipeSaga
} from "../../src/redux/actions/recipeActions";
import recordSaga from "../../recordSaga";
import type { CREATE_RECIPE_START } from "../../src/redux/reducers/recipesReducer";
describe("submitRecipeSaga", () => {
  it("returns a fully constructed recipe object on success", async () => {
    const submitRecipeApi = jest.fn().mockImplementation(() => {
      console.log("mock hello");
      return { type: "mock return" };
    });

    const startAction: CREATE_RECIPE_START = {
      type: "CREATE_RECIPE_START",
      recipeObj: mockRecipes[0]
    };
    const dispatched = await recordSaga(submitRecipeSaga, startAction);
    expect(dispatched).toContainEqual({ type: "mock return" });
  });
});

测试失败,已命中submitRecipeApi,返回未定义,并且未记录“模拟问候”

但是,由于各种原因,我想到的尝试方式却行不通:

  1. const submitRecipeApi = jest.fn().mockImplentation(...)- 使用上面编写的代码,mock函数似乎没有被击中。

  2. 导出submitRecipeApi并将其导入测试文件,并按原样保留代码(与#1中相同),其结果与#1相同。奇怪的是,const submitRecipeApi的重新声明不会引起任何错误。

  3. 导入为#2,但删除const,将submitRecipeApi = jest.fn()从声明更改为赋值。这给出了错误"submitRecipeApi" is read-only.

  4. 不导入submitRecipeApi,并且像#3中那样进行简单分配。错误:ReferenceError: submitRecipeApi is not defined

我在做什么错了?

0 个答案:

没有答案