我如何编写一个函数,该函数取决于其他函数的返回?

时间:2019-01-21 00:54:05

标签: javascript firebase-realtime-database jestjs redux-saga

export function* removeProfile(auth, database, action){
try{  
    const url = `/users/${action.user.uid}` 

    const {ref} = database
    const result = yield call([database, ref], url)
    const {remove} = database.ref() 
    yield call([result, remove])   //how can i do a test for this case?   
}catch({message}){
    yield put(ActionCreator.removeProfileFailure(message))      
}     
}

我需要测试一个依赖于另一个响应的函数,我该怎么做?

1 个答案:

答案 0 :(得分:0)

使用mocks

您的removeProfile函数非常易于进行(单元)测试,因为它几乎具有零外部依赖关系(ActionCreator除外)。

因此,您可以传递authdatabaseaction的模拟版本。模拟是一种具有与原始签名相同的签名的功能,但是非常易于使用。

有很多测试传奇的方法,但是像您这样的简单传奇,您可以使用runSaga,顾名思义,它可以运行整个传奇,而无需手动调用saga.next(...)

Here,您可以找到我测试的有效示例。

看看我写的测试

const { removeProfile } = require("./remove-profile");
const { runSaga } = require("redux-saga");

test("Mocking the database call", () => {
  const removeMock = jest.fn(() => ({
    // place here the remove's return value
  }));

  const databaseMock = {
    ref: url => ({
      remove: removeMock
    })
  };

  runSaga(
    {}, // options
    removeProfile, // your saga
    // below all the arguments for the saga
    null,
    databaseMock,
    { user: { uid: "999" } }
  );
  expect(removeMock).toHaveBeenCalled();
});

让我知道它是否足够清晰