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))
}
}
我需要测试一个依赖于另一个响应的函数,我该怎么做?
答案 0 :(得分:0)
使用mocks。
您的removeProfile
函数非常易于进行(单元)测试,因为它几乎具有零外部依赖关系(ActionCreator
除外)。
因此,您可以传递auth
,database
和action
的模拟版本。模拟是一种具有与原始签名相同的签名的功能,但是非常易于使用。
有很多测试传奇的方法,但是像您这样的简单传奇,您可以使用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();
});
让我知道它是否足够清晰