Как я могу написать тест для функции, которая зависит от возврата другой? - PullRequest
0 голосов
/ 21 января 2019
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 голосов
/ 22 января 2019

Использовать издевается .

Ваша функция removeProfile действительно легко (единично) протестирована, поскольку она имеет практически нулевые внешние зависимости (за исключением ActionCreator).

Таким образом, вы можете передать поддельные версии auth, database и action. Макет - это функция с той же сигнатурой, что и у оригинала, но она очень проста в использовании.

Существует множество способов проверить сагу, но с такой простой сагой, как ваша, вы можете использовать runSaga , которая, как следует из названия, запускает всю сагу без ручного вызова saga.next(...).

Здесь вы можете найти рабочий пример моего теста.

Взгляните на тест, который я написал

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();
});

Дайте мне знать, если это достаточно ясно 10

...